#pragma once #include #include #include #include #include #include namespace DB { class Block; class Context; struct FormatSettings; class ReadBuffer; class WriteBuffer; class IProcessor; using ProcessorPtr = std::shared_ptr; class IInputFormat; class IOutputFormat; struct RowInputFormatParams; using InputFormatPtr = std::shared_ptr; using OutputFormatPtr = std::shared_ptr; /** Allows to create an IBlockInputStream or IBlockOutputStream by the name of the format. * Note: format and compression are independent things. */ class FormatFactory final : public ext::singleton { public: /// This callback allows to perform some additional actions after reading a single row. /// It's initial purpose was to extract payload for virtual columns from Kafka Consumer ReadBuffer. using ReadCallback = std::function; private: using InputCreator = std::function; using OutputCreator = std::function; using InputProcessorCreator = std::function; using OutputProcessorCreator = std::function; using Creators = std::pair; using ProcessorCreators = std::pair; using FormatsDictionary = std::unordered_map; using FormatProcessorsDictionary = std::unordered_map; public: BlockInputStreamPtr getInput( const String & name, ReadBuffer & buf, const Block & sample, const Context & context, UInt64 max_block_size, UInt64 rows_portion_size = 0, ReadCallback callback = {}) const; BlockOutputStreamPtr getOutput(const String & name, WriteBuffer & buf, const Block & sample, const Context & context) const; InputFormatPtr getInputFormat( const String & name, ReadBuffer & buf, const Block & sample, const Context & context, UInt64 max_block_size, UInt64 rows_portion_size = 0, ReadCallback callback = {}) const; OutputFormatPtr getOutputFormat(const String & name, WriteBuffer & buf, const Block & sample, const Context & context) const; /// Register format by its name. void registerInputFormat(const String & name, InputCreator input_creator); void registerOutputFormat(const String & name, OutputCreator output_creator); void registerInputFormatProcessor(const String & name, InputProcessorCreator input_creator); void registerOutputFormatProcessor(const String & name, OutputProcessorCreator output_creator); const FormatProcessorsDictionary & getAllFormats() const { return processors_dict; } private: /// FormatsDictionary dict; FormatProcessorsDictionary processors_dict; FormatFactory(); friend class ext::singleton; //const Creators & getCreators(const String & name) const; const ProcessorCreators & getProcessorCreators(const String & name) const; }; }