Exemple #1
0
        private void HandleHeaders()
        {
            var options = Configuration.Options;

            if (options.ReadHeader == ReadHeader.Never)
            {
                // can just use the discovered copy from source
                ReadHeaders = ReadHeader.Never;
                ColumnCount = Configuration.DeserializeColumns.Length;
                TryMakeStateMachine();

                return;
            }

            // should always have been initialized by now
            var rowEndings = Utils.NonNullValue(RowEndings);

            using (
                var headerReader = new HeadersReader <T>(
                    StateMachine,
                    Configuration,
                    SharedCharacterLookup,
                    Inner,
                    Buffer,
                    rowEndings
                    )
                )
            {
                var headers = headerReader.Read();

                HandleHeadersReaderResult(headers);
            }
        }
Exemple #2
0
        internal void WriteEncoded(ReadOnlySpan <char> charSpan)
        {
            var escapedValueStartAndStop = Utils.NonNullValue(Configuration.Options.EscapedValueStartAndEnd);

            // try and blit things in big chunks
            var start = 0;
            var end   = Utils.FindChar(charSpan, start, escapedValueStartAndStop);

            while (end != -1)
            {
                var escapeValueEscapeChar = Utils.NonNullValue(Configuration.Options.EscapedValueEscapeCharacter);

                var len     = end - start;
                var toWrite = charSpan.Slice(start, len);

                PlaceAllInStaging(toWrite);

                PlaceCharInStaging(escapeValueEscapeChar);

                start += len;
                end    = Utils.FindChar(charSpan, start + 1, escapedValueStartAndStop);
            }

            if (start != charSpan.Length)
            {
                var toWrite = charSpan.Slice(start);

                PlaceAllInStaging(toWrite);
            }
        }
Exemple #3
0
        internal void WriteEncoded(ReadOnlySequence <char> head)
        {
            var escapedValueStartAndStop = Utils.NonNullValue(Configuration.Options.EscapedValueEscapeCharacter);

            // start with whatever the escape is
            PlaceCharInStaging(escapedValueStartAndStop);

            foreach (var cur in head)
            {
                WriteEncoded(cur.Span);
            }

            // end with the escape
            PlaceCharInStaging(escapedValueStartAndStop);
        }
Exemple #4
0
        internal void WriteSingleSegment(ReadOnlySpan <char> charSpan)
        {
            if (!NeedsEncode(charSpan))
            {
                // most of the time we have no need to encode
                //   so just blit this write into the stream

                PlaceAllInStaging(charSpan);
            }
            else
            {
                var options = Configuration.Options;

                CheckCanEncode(charSpan, options);

                var escapedValueStartAndStop = Utils.NonNullValue(options.EscapedValueStartAndEnd);

                PlaceCharInStaging(escapedValueStartAndStop);

                WriteEncoded(charSpan);

                PlaceCharInStaging(escapedValueStartAndStop);
            }
        }
Exemple #5
0
        private void HandleHeaders()
        {
            var options = Configuration.Options;

            ReadHeaders = options.ReadHeader;

            var allowColumnsByName = options.ReadHeader == ReadHeader.Always;

            using (var reader = new HeadersReader <object>(StateMachine, Configuration, SharedCharacterLookup, Inner, Buffer, Utils.NonNullValue(RowEndings)))
            {
                var(headers, isHeader, pushBack) = reader.Read();
                ColumnCount = headers.Count;

                if (ColumnCount == 0)
                {
                    // rare, but possible if the file is empty or all comments or something like that
                    ColumnNames.Value = Array.Empty <string>();
                }
                else
                {
                    string[] columnNamesValue = Array.Empty <string>();
                    if (allowColumnsByName)
                    {
                        columnNamesValue  = new string[ColumnCount];
                        ColumnNames.Value = columnNamesValue;

                        using (var e = headers)
                        {
                            var ix = 0;
                            while (e.MoveNext())
                            {
                                var name = allowColumnsByName ? new string(e.Current.Span) : null;
                                if (name != null)
                                {
                                    columnNamesValue[ix] = name;
                                }

                                ix++;
                            }
                        }

                        Interlocked.Increment(ref NameLookupReferenceCount);
                        NameLookup = NameLookup.Create(columnNamesValue, Configuration.MemoryPool);
                    }

                    RowBuilder.SetColumnOrder(Configuration.Options, headers);
                }

                Buffer.PushBackFromOutsideBuffer(pushBack);
            }

            TryMakeStateMachine();
        }
        internal override void WriteInner(dynamic row)
        {
            try
            {
                WriteHeadersAndEndRowIfNeeded(row);

                var wholeRowContext = WriteContext.DiscoveringCells(Configuration.Options, RowNumber, Context);

                var options        = Configuration.Options;
                var valueSeparator = Configuration.ValueSeparatorMemory.Span;

                var cellValuesMem = Utils.GetCells(Configuration.DynamicMemoryPool, ref CellBuffer, options.TypeDescriber, in wholeRowContext, row as object);

                var columnNamesValue = Utils.NonNullValue(ColumnNames);

                Utils.ForceInOrder(columnNamesValue, ColumnNameSorter, cellValuesMem);
                var cellValuesEnumerableSpan = cellValuesMem.Span;

                var i = 0;
                foreach (var cell in cellValuesEnumerableSpan)
                {
                    var needsSeparator = i != 0;

                    if (needsSeparator)
                    {
                        PlaceAllInStaging(valueSeparator);
                    }

                    ColumnIdentifier ci;
                    if (i < columnNamesValue.Length)
                    {
                        var name = columnNamesValue.GetColumnAt(i);
                        ci = ColumnIdentifier.CreateInner(i, null, name);
                    }
                    else
                    {
                        ci = ColumnIdentifier.Create(i);
                    }

                    var ctx = WriteContext.WritingColumn(Configuration.Options, RowNumber, ci, Context);

                    var formatter   = cell.Formatter;
                    var delProvider = (ICreatesCacheableDelegate <Formatter.DynamicFormatterDelegate>)formatter;
                    var del         = delProvider.Guarantee(this);

                    var val = cell.Value as object;
                    if (!del(val, in ctx, Buffer))
                    {
                        Throw.SerializationException($"Could not write column {ci}, formatter {formatter} returned false");
                    }

                    ReadOnlySequence <char> res = default;
                    if (!Buffer.MakeSequence(ref res))
                    {
                        // nothing was written, so just move on
                        goto end;
                    }

                    WriteValue(res);
                    Buffer.Reset();

end:
                    i++;
                }

                RowNumber++;
            }
            catch (Exception e)
            {
                Throw.PoisonAndRethrow(this, e);
            }
        }