#include #include #include #include #include #include namespace DB { BinaryRowOutputFormat::BinaryRowOutputFormat(WriteBuffer & out_, const Block & header, bool with_names_, bool with_types_) : IRowOutputFormat(header, out_), with_names(with_names_), with_types(with_types_) { } void BinaryRowOutputFormat::writePrefix() { auto & header = getPort(PortKind::Main).getHeader(); size_t columns = header.columns(); if (with_names || with_types) { writeVarUInt(columns, out); } if (with_names) { for (size_t i = 0; i < columns; ++i) { writeStringBinary(header.safeGetByPosition(i).name, out); } } if (with_types) { for (size_t i = 0; i < columns; ++i) { writeStringBinary(header.safeGetByPosition(i).type->getName(), out); } } } void BinaryRowOutputFormat::writeField(const IColumn & column, const IDataType & type, size_t row_num) { type.serializeBinary(column, row_num, out); } void registerOutputFormatProcessorRowBinary(FormatFactory & factory) { factory.registerOutputFormatProcessor("RowBinary", []( WriteBuffer & buf, const Block & sample, const Context &, const FormatSettings &) { return std::make_shared(buf, sample, false, false); }); factory.registerOutputFormatProcessor("RowBinaryWithNamesAndTypes", []( WriteBuffer & buf, const Block & sample, const Context &, const FormatSettings &) { return std::make_shared(buf, sample, true, true); }); } }