/// <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); } } } }
/// <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); } } } }
public void ParseFluxResponse(string source, ICancellable cancellable, IFluxResponseConsumer consumer) { Arguments.CheckNonEmptyString(source, "source"); ParseFluxResponse(ToStream(source), cancellable, consumer); }