ClickHouse/dbms/Interpreters/ExternalLoaderDatabaseConfigRepository.cpp

65 lines
2.1 KiB
C++
Raw Normal View History

2019-10-15 14:09:57 +00:00
#include <Interpreters/ExternalLoaderDatabaseConfigRepository.h>
#include <Interpreters/ExternalDictionariesLoader.h>
2019-10-15 14:09:57 +00:00
#include <Dictionaries/getDictionaryConfigurationFromAST.h>
#include <Common/StringUtils/StringUtils.h>
2019-10-15 14:09:57 +00:00
namespace DB
{
namespace ErrorCodes
{
extern const int UNKNOWN_DICTIONARY;
}
namespace
{
String trimDatabaseName(const std::string & loadable_definition_name, const IDatabase & database)
2019-10-15 14:09:57 +00:00
{
const auto & dbname = database.getDatabaseName();
2019-10-15 14:09:57 +00:00
if (!startsWith(loadable_definition_name, dbname))
throw Exception(
"Loadable '" + loadable_definition_name + "' is not from database '" + database.getDatabaseName(), ErrorCodes::UNKNOWN_DICTIONARY);
2019-10-15 14:09:57 +00:00
/// dbname.loadable_name
///--> remove <---
2019-10-15 18:04:17 +00:00
return loadable_definition_name.substr(dbname.length() + 1);
2019-10-15 14:09:57 +00:00
}
}
ExternalLoaderDatabaseConfigRepository::ExternalLoaderDatabaseConfigRepository(IDatabase & database_, const Context & context_)
: name(database_.getDatabaseName())
, database(database_)
, context(context_)
{
}
LoadablesConfigurationPtr ExternalLoaderDatabaseConfigRepository::load(const std::string & loadable_definition_name)
2019-10-15 14:09:57 +00:00
{
String dictname = trimDatabaseName(loadable_definition_name, database);
return getDictionaryConfigurationFromAST(database.getCreateDictionaryQuery(context, dictname)->as<const ASTCreateQuery &>());
2019-10-15 14:09:57 +00:00
}
bool ExternalLoaderDatabaseConfigRepository::exists(const std::string & loadable_definition_name)
2019-10-15 14:09:57 +00:00
{
return database.isDictionaryExist(context, trimDatabaseName(loadable_definition_name, database));
2019-10-15 14:09:57 +00:00
}
Poco::Timestamp ExternalLoaderDatabaseConfigRepository::getUpdateTime(const std::string & loadable_definition_name)
{
return database.getObjectMetadataModificationTime(trimDatabaseName(loadable_definition_name, database));
2019-10-15 14:09:57 +00:00
}
std::set<std::string> ExternalLoaderDatabaseConfigRepository::getAllLoadablesDefinitionNames()
2019-10-15 14:09:57 +00:00
{
std::set<std::string> result;
const auto & dbname = database.getDatabaseName();
auto itr = database.getDictionariesIterator(context);
2019-10-15 14:09:57 +00:00
while (itr && itr->isValid())
{
result.insert(dbname + "." + itr->name());
itr->next();
}
return result;
}
}