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(); }
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)); }