ClickHouse/dbms/src/Storages/StorageFactory.h

78 lines
2.1 KiB
C++
Raw Normal View History

2011-10-31 17:30:44 +00:00
#pragma once
2019-04-03 11:13:22 +00:00
#include <Common/NamePrompter.h>
#include <Parsers/IAST_fwd.h>
#include <Storages/ColumnsDescription.h>
#include <Storages/IStorage_fwd.h>
#include <ext/singleton.h>
#include <unordered_map>
2011-10-31 17:30:44 +00:00
namespace DB
{
2012-05-22 19:32:56 +00:00
class Context;
class ASTCreateQuery;
class ASTStorage;
2011-10-31 17:30:44 +00:00
/** Allows to create a table by the name and parameters of the engine.
* In 'columns' Nested data structures must be flattened.
* You should subsequently call IStorage::startup method to work with table.
2011-10-31 17:30:44 +00:00
*/
2019-04-03 11:13:22 +00:00
class StorageFactory : public ext::singleton<StorageFactory>, public IHints<1, StorageFactory>
2011-10-31 17:30:44 +00:00
{
public:
struct Arguments
{
const String & engine_name;
ASTs & engine_args;
ASTStorage * storage_def;
const ASTCreateQuery & query;
const String & data_path;
const String & table_name;
const String & database_name;
Context & local_context;
Context & context;
const ColumnsDescription & columns;
bool attach;
bool has_force_restore_data_flag;
};
using Creator = std::function<StoragePtr(const Arguments & arguments)>;
StoragePtr get(
ASTCreateQuery & query,
const String & data_path,
const String & table_name,
const String & database_name,
Context & local_context,
Context & context,
const ColumnsDescription & columns,
bool attach,
bool has_force_restore_data_flag) const;
2017-12-30 04:03:30 +00:00
/// Register a table engine by its name.
/// No locking, you must register all engines before usage of get.
void registerStorage(const std::string & name, Creator creator);
const auto & getAllStorages() const
{
return storages;
}
2019-04-03 11:13:22 +00:00
std::vector<String> getAllRegisteredNames() const override
{
std::vector<String> result;
auto getter = [](const auto & pair) { return pair.first; };
std::transform(storages.begin(), storages.end(), std::back_inserter(result), getter);
return result;
}
private:
using Storages = std::unordered_map<std::string, Creator>;
Storages storages;
2011-10-31 17:30:44 +00:00
};
}