1#include <IO/WriteHelpers.h>
2#include <IO/WriteBufferFromString.h>
3#include <Processors/Formats/Impl/TSKVRowOutputFormat.h>
4#include <Formats/FormatFactory.h>
5
6
7
8namespace DB
9{
10
11TSKVRowOutputFormat::TSKVRowOutputFormat(WriteBuffer & out_, const Block & header, FormatFactory::WriteCallback callback, const FormatSettings & format_settings_)
12 : TabSeparatedRowOutputFormat(out_, header, false, false, callback, format_settings_)
13{
14 auto & sample = getPort(PortKind::Main).getHeader();
15 NamesAndTypesList columns(sample.getNamesAndTypesList());
16 fields.assign(columns.begin(), columns.end());
17
18 for (auto & field : fields)
19 {
20 WriteBufferFromOwnString wb;
21 writeAnyEscapedString<'='>(field.name.data(), field.name.data() + field.name.size(), wb);
22 writeCString("=", wb);
23 field.name = wb.str();
24 }
25}
26
27
28void TSKVRowOutputFormat::writeField(const IColumn & column, const IDataType & type, size_t row_num)
29{
30 writeString(fields[field_number].name, out);
31 type.serializeAsTextEscaped(column, row_num, out, format_settings);
32 ++field_number;
33}
34
35
36void TSKVRowOutputFormat::writeRowEndDelimiter()
37{
38 writeChar('\n', out);
39 field_number = 0;
40}
41
42
43void registerOutputFormatProcessorTSKV(FormatFactory & factory)
44{
45 factory.registerOutputFormatProcessor("TSKV", [](
46 WriteBuffer & buf,
47 const Block & sample,
48 FormatFactory::WriteCallback callback,
49 const FormatSettings & settings)
50 {
51 return std::make_shared<TSKVRowOutputFormat>(buf, sample, callback, settings);
52 });
53}
54
55}
56