2019-11-27 09:39:44 +00:00
|
|
|
#include "DiskFactory.h"
|
|
|
|
|
|
|
|
namespace DB
|
|
|
|
{
|
|
|
|
namespace ErrorCodes
|
|
|
|
{
|
|
|
|
extern const int LOGICAL_ERROR;
|
|
|
|
extern const int UNKNOWN_ELEMENT_IN_CONFIG;
|
|
|
|
}
|
|
|
|
|
|
|
|
DiskFactory & DiskFactory::instance()
|
|
|
|
{
|
|
|
|
static DiskFactory factory;
|
|
|
|
return factory;
|
|
|
|
}
|
|
|
|
|
2024-01-10 12:14:10 +00:00
|
|
|
void DiskFactory::registerDiskType(const String & disk_type, Creator creator)
|
2019-11-27 09:39:44 +00:00
|
|
|
{
|
|
|
|
if (!registry.emplace(disk_type, creator).second)
|
2023-01-23 21:13:58 +00:00
|
|
|
throw Exception(ErrorCodes::LOGICAL_ERROR, "DiskFactory: the disk type '{}' is not unique", disk_type);
|
2019-11-27 09:39:44 +00:00
|
|
|
}
|
|
|
|
|
2019-11-28 19:11:49 +00:00
|
|
|
DiskPtr DiskFactory::create(
|
2019-11-27 09:39:44 +00:00
|
|
|
const String & name,
|
|
|
|
const Poco::Util::AbstractConfiguration & config,
|
|
|
|
const String & config_prefix,
|
2021-06-18 05:28:08 +00:00
|
|
|
ContextPtr context,
|
2024-01-16 13:25:09 +00:00
|
|
|
const DisksMap & map,
|
|
|
|
bool attach,
|
|
|
|
bool custom_disk) const
|
2019-11-27 09:39:44 +00:00
|
|
|
{
|
|
|
|
const auto disk_type = config.getString(config_prefix + ".type", "local");
|
|
|
|
|
|
|
|
const auto found = registry.find(disk_type);
|
|
|
|
if (found == registry.end())
|
2024-01-10 12:14:10 +00:00
|
|
|
{
|
|
|
|
throw Exception(ErrorCodes::UNKNOWN_ELEMENT_IN_CONFIG,
|
|
|
|
"DiskFactory: the disk '{}' has unknown disk type: {}", name, disk_type);
|
|
|
|
}
|
2019-11-27 09:39:44 +00:00
|
|
|
|
|
|
|
const auto & disk_creator = found->second;
|
2024-01-16 13:25:09 +00:00
|
|
|
return disk_creator(name, config, config_prefix, context, map, attach, custom_disk);
|
2019-11-27 09:39:44 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
}
|