Exemple #1
0
        /// <summary>
        /// Parse Flux CSV response to <see cref="IFluxResponseConsumer"/>.
        /// </summary>
        /// <param name="source">CSV Data source</param>
        /// <param name="cancellable">to cancel parsing</param>
        /// <param name="consumer">to accept <see cref="FluxTable"/> or <see cref="FluxRecord"/></param>
        public void ParseFluxResponse(Stream source, ICancellable cancellable, IFluxResponseConsumer consumer)
        {
            Arguments.CheckNotNull(source, "source");

            using var csv = new CsvReader(new StreamReader(source), CultureInfo.InvariantCulture);
            var state = new ParseFluxResponseState {
                csv = csv
            };

            while (csv.Read())
            {
                if (cancellable != null && cancellable.IsCancelled())
                {
                    return;
                }

                foreach (var(table, record) in ParseNextFluxResponse(state))
                {
                    if (record == null)
                    {
                        consumer.Accept(state.tableIndex, cancellable, table);
                    }
                    else
                    {
                        consumer.Accept(state.tableIndex - 1, cancellable, record);
                    }
                }
            }
        }
Exemple #2
0
        /// <summary>
        /// Parse Flux CSV response to <see cref="IFluxResponseConsumer"/>.
        /// </summary>
        /// <param name="source">CSV Data source</param>
        /// <param name="cancellable">to cancel parsing</param>
        /// <param name="consumer">to accept <see cref="FluxTable"/> or <see cref="FluxRecord"/></param>
        public void ParseFluxResponse(Stream source, ICancellable cancellable, IFluxResponseConsumer consumer)
        {
            Arguments.CheckNotNull(source, "source");

            var parsingState = ParsingState.Normal;

            var       tableIndex    = 0;
            var       tableId       = -1;
            var       startNewTable = false;
            FluxTable table         = null;

            using (var csv = new CsvReader(new StreamReader(source)))
            {
                while (csv.Read())
                {
                    if (cancellable != null && cancellable.IsCancelled())
                    {
                        return;
                    }

                    //
                    // Response has HTTP status ok, but response is error.
                    //
                    if ("error".Equals(csv[1]) && "reference".Equals(csv[2]))
                    {
                        parsingState = ParsingState.InError;
                        continue;
                    }

                    //
                    // Throw InfluxException with error response
                    //
                    if (ParsingState.InError.Equals(parsingState))
                    {
                        var error          = csv[1];
                        var referenceValue = csv[2];

                        var reference = 0;

                        if (referenceValue != null && !String.IsNullOrEmpty(referenceValue))
                        {
                            reference = Convert.ToInt32(referenceValue);
                        }

                        throw new FluxQueryException(error, reference);
                    }

                    var token = csv[0];

                    //// start new table
                    if ("#datatype".Equals(token))
                    {
                        startNewTable = true;

                        table = new FluxTable();
                        consumer.Accept(tableIndex, cancellable, table);
                        tableIndex++;
                        tableId = -1;
                    }
                    else if (table == null)
                    {
                        throw new FluxCsvParserException(
                                  "Unable to parse CSV response. FluxTable definition was not found.");
                    }

                    //#datatype,string,long,dateTime:RFC3339,dateTime:RFC3339,dateTime:RFC3339,double,string,string,string
                    if ("#datatype".Equals(token))
                    {
                        AddDataTypes(table, csv);
                    }
                    else if ("#group".Equals(token))
                    {
                        AddGroups(table, csv);
                    }
                    else if ("#default".Equals(token))
                    {
                        AddDefaultEmptyValues(table, csv);
                    }
                    else
                    {
                        // parse column names
                        if (startNewTable)
                        {
                            AddColumnNamesAndTags(table, csv);
                            startNewTable = false;
                            continue;
                        }

                        int currentId;

                        try
                        {
                            currentId = Convert.ToInt32(csv[1 + 1]);
                        }
                        catch (Exception)
                        {
                            throw new FluxCsvParserException("Unable to parse CSV response.");
                        }
                        if (tableId == -1)
                        {
                            tableId = currentId;
                        }

                        if (tableId != currentId)
                        {
                            //create new table with previous column headers settings
                            var fluxColumns = table.Columns;
                            table = new FluxTable();
                            table.Columns.AddRange(fluxColumns);
                            consumer.Accept(tableIndex, cancellable, table);
                            tableIndex++;
                            tableId = currentId;
                        }

                        var fluxRecord = ParseRecord(tableIndex - 1, table, csv);
                        consumer.Accept(tableIndex - 1, cancellable, fluxRecord);
                    }
                }
            }
        }
Exemple #3
0
        public void ParseFluxResponse(string source, ICancellable cancellable, IFluxResponseConsumer consumer)
        {
            Arguments.CheckNonEmptyString(source, "source");

            ParseFluxResponse(ToStream(source), cancellable, consumer);
        }