1#pragma once
2
3#include "config_formats.h"
4#if USE_PROTOBUF
5
6#include <Core/Block.h>
7#include <Formats/FormatSettings.h>
8#include <Formats/ProtobufWriter.h>
9#include <Formats/FormatSchemaInfo.h>
10#include <Processors/Formats/IRowOutputFormat.h>
11
12
13namespace google
14{
15namespace protobuf
16{
17 class Message;
18}
19}
20
21
22namespace DB
23{
24/** Stream designed to serialize data in the google protobuf format.
25 * Each row is written as a separated message.
26 * These messages are delimited according to documentation
27 * https://github.com/protocolbuffers/protobuf/blob/master/src/google/protobuf/util/delimited_message_util.h
28 * Serializing in the protobuf format requires the 'format_schema' setting to be set, e.g.
29 * SELECT * from table FORMAT Protobuf SETTINGS format_schema = 'schema:Message'
30 * where schema is the name of "schema.proto" file specifying protobuf schema.
31 */
32class ProtobufRowOutputFormat : public IRowOutputFormat
33{
34public:
35 ProtobufRowOutputFormat(
36 WriteBuffer & out_,
37 const Block & header,
38 FormatFactory::WriteCallback callback,
39 const FormatSchemaInfo & format_schema);
40
41 String getName() const override { return "ProtobufRowOutputFormat"; }
42
43 void write(const Columns & columns, size_t row_num) override;
44 void writeField(const IColumn &, const IDataType &, size_t) override {}
45 std::string getContentType() const override { return "application/octet-stream"; }
46
47private:
48 DataTypes data_types;
49 ProtobufWriter writer;
50 std::vector<size_t> value_indices;
51};
52
53}
54#endif
55