2018-06-10 19:22:49 +00:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
#include <functional>
|
|
|
|
#include <unordered_map>
|
|
|
|
#include <ext/singleton.h>
|
|
|
|
#include <Core/Types.h>
|
|
|
|
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
|
|
|
|
class Block;
|
|
|
|
class Context;
|
|
|
|
struct FormatSettings;
|
|
|
|
|
|
|
|
class ReadBuffer;
|
|
|
|
class WriteBuffer;
|
|
|
|
|
|
|
|
class IBlockInputStream;
|
|
|
|
class IBlockOutputStream;
|
|
|
|
|
|
|
|
using BlockInputStreamPtr = std::shared_ptr<IBlockInputStream>;
|
|
|
|
using BlockOutputStreamPtr = std::shared_ptr<IBlockOutputStream>;
|
|
|
|
|
2019-03-26 18:28:37 +00:00
|
|
|
class IProcessor;
|
|
|
|
using ProcessorPtr = std::shared_ptr<IProcessor>;
|
|
|
|
|
2019-02-19 18:41:18 +00:00
|
|
|
class IInputFormat;
|
|
|
|
class IOutputFormat;
|
|
|
|
|
|
|
|
class RowInputFormatParams;
|
|
|
|
|
|
|
|
using InputFormatPtr = std::shared_ptr<IInputFormat>;
|
|
|
|
using OutputFormatPtr = std::shared_ptr<IOutputFormat>;
|
|
|
|
|
2018-06-10 19:22:49 +00:00
|
|
|
|
|
|
|
/** 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<FormatFactory>
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
using InputCreator = std::function<BlockInputStreamPtr(
|
|
|
|
ReadBuffer & buf,
|
|
|
|
const Block & sample,
|
|
|
|
const Context & context,
|
2019-02-10 16:55:12 +00:00
|
|
|
UInt64 max_block_size,
|
2018-06-10 19:22:49 +00:00
|
|
|
const FormatSettings & settings)>;
|
|
|
|
|
|
|
|
using OutputCreator = std::function<BlockOutputStreamPtr(
|
|
|
|
WriteBuffer & buf,
|
|
|
|
const Block & sample,
|
|
|
|
const Context & context,
|
|
|
|
const FormatSettings & settings)>;
|
|
|
|
|
2019-02-19 18:41:18 +00:00
|
|
|
using InputProcessorCreator = std::function<InputFormatPtr(
|
|
|
|
ReadBuffer & buf,
|
|
|
|
const Block & header,
|
|
|
|
const Context & context,
|
|
|
|
const RowInputFormatParams & params,
|
|
|
|
const FormatSettings & settings)>;
|
|
|
|
|
|
|
|
using OutputProcessorCreator = std::function<OutputFormatPtr(
|
|
|
|
WriteBuffer & buf,
|
|
|
|
const Block & sample,
|
|
|
|
const Context & context,
|
|
|
|
const FormatSettings & settings)>;
|
|
|
|
|
2018-06-10 19:22:49 +00:00
|
|
|
using Creators = std::pair<InputCreator, OutputCreator>;
|
2019-02-19 18:41:18 +00:00
|
|
|
using ProcessorCreators = std::pair<InputProcessorCreator, OutputProcessorCreator>;
|
2018-06-10 19:22:49 +00:00
|
|
|
|
|
|
|
using FormatsDictionary = std::unordered_map<String, Creators>;
|
2019-02-19 18:41:18 +00:00
|
|
|
using FormatProcessorsDictionary = std::unordered_map<String, ProcessorCreators>;
|
2018-06-10 19:22:49 +00:00
|
|
|
|
|
|
|
public:
|
|
|
|
BlockInputStreamPtr getInput(const String & name, ReadBuffer & buf,
|
2019-02-10 16:55:12 +00:00
|
|
|
const Block & sample, const Context & context, UInt64 max_block_size) const;
|
2018-06-10 19:22:49 +00:00
|
|
|
|
|
|
|
BlockOutputStreamPtr getOutput(const String & name, WriteBuffer & buf,
|
|
|
|
const Block & sample, const Context & context) const;
|
|
|
|
|
2019-02-19 18:41:18 +00:00
|
|
|
InputFormatPtr getInputFormat(const String & name, ReadBuffer & buf,
|
|
|
|
const Block & sample, const Context & context, UInt64 max_block_size) const;
|
|
|
|
|
|
|
|
OutputFormatPtr getOutputFormat(const String & name, WriteBuffer & buf,
|
|
|
|
const Block & sample, const Context & context) const;
|
|
|
|
|
2018-06-10 19:22:49 +00:00
|
|
|
/// Register format by its name.
|
|
|
|
void registerInputFormat(const String & name, InputCreator input_creator);
|
|
|
|
void registerOutputFormat(const String & name, OutputCreator output_creator);
|
|
|
|
|
2019-02-19 18:41:18 +00:00
|
|
|
void registerInputFormatProcessor(const String & name, InputProcessorCreator input_creator);
|
|
|
|
void registerOutputFormatProcessor(const String & name, OutputProcessorCreator output_creator);
|
|
|
|
|
2018-07-20 15:59:11 +00:00
|
|
|
const FormatsDictionary & getAllFormats() const
|
|
|
|
{
|
2018-07-20 10:00:56 +00:00
|
|
|
return dict;
|
|
|
|
}
|
|
|
|
|
2018-06-10 19:22:49 +00:00
|
|
|
private:
|
|
|
|
FormatsDictionary dict;
|
2019-02-19 18:41:18 +00:00
|
|
|
FormatProcessorsDictionary processors_dict;
|
2018-06-10 19:22:49 +00:00
|
|
|
|
|
|
|
FormatFactory();
|
|
|
|
friend class ext::singleton<FormatFactory>;
|
|
|
|
|
|
|
|
const Creators & getCreators(const String & name) const;
|
2019-02-19 18:41:18 +00:00
|
|
|
const ProcessorCreators & getProcessorCreators(const String & name) const;
|
2018-06-10 19:22:49 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
}
|