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 | |
8 | namespace DB |
9 | { |
10 | |
11 | TSKVRowOutputFormat::TSKVRowOutputFormat(WriteBuffer & out_, const Block & , 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 | |
28 | void 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 | |
36 | void TSKVRowOutputFormat::writeRowEndDelimiter() |
37 | { |
38 | writeChar('\n', out); |
39 | field_number = 0; |
40 | } |
41 | |
42 | |
43 | void 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 | |