コード例 #1
0
            private void WriteTable(IClickHouseTableWriter table)
            {
                var writer = _client._writer;

                writer.Write7BitInt32((int)ClientMessageCode.Data);
                writer.WriteString(table.TableName);

                var compression = _client._settings.Compress ? CompressionAlgorithm.Lz4 : CompressionAlgorithm.None;

                writer.BeginCompress(compression, _client._settings.CompressionBlockSize);

                writer.WriteByte(BlockFieldCodes.IsOverflows);
                writer.WriteBool(false); // is overflow
                writer.WriteByte(BlockFieldCodes.BucketNum);
                writer.WriteInt32(-1);   // data size in block. -1 for null
                writer.WriteByte(BlockFieldCodes.End);

                writer.Write7BitInt32(table.Columns.Count);
                writer.Write7BitInt32(table.RowCount);

                foreach (var column in table.Columns)
                {
                    writer.WriteString(column.ColumnName);
                    writer.WriteString(column.ColumnType);

                    int rowCount = table.RowCount;
                    while (rowCount > 0)
                    {
                        var size = writer.WriteRaw(mem => column.WriteNext(mem.Span));
                        rowCount -= size.Elements;
                    }
                }

                writer.EndCompress();
            }
コード例 #2
0
            public async ValueTask SendTable(IClickHouseTableWriter table, bool async, CancellationToken cancellationToken)
            {
                CheckDisposed();

                try
                {
                    WriteTable(table);
                }
                catch (Exception ex)
                {
                    _client._writer.Discard();
                    throw ClickHouseHandledException.Wrap(ex);
                }

                await WithCancellationToken(cancellationToken, ct => _client._writer.Flush(async, ct));
            }