mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-30 05:30:51 +00:00
refactor IDatabase
This commit is contained in:
parent
9bbeb6359a
commit
d0af0c8703
@ -22,13 +22,9 @@ namespace ErrorCodes
|
|||||||
extern const int UNSUPPORTED_METHOD;
|
extern const int UNSUPPORTED_METHOD;
|
||||||
}
|
}
|
||||||
|
|
||||||
DatabaseDictionary::DatabaseDictionary(const String & name_)
|
DatabaseDictionary::DatabaseDictionary(String name_)
|
||||||
: name(name_),
|
: IDatabase(std::move(name_)),
|
||||||
log(&Logger::get("DatabaseDictionary(" + name + ")"))
|
log(&Logger::get("DatabaseDictionary(" + database_name + ")"))
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::loadStoredObjects(Context &, bool)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,15 +65,6 @@ bool DatabaseDictionary::isTableExist(
|
|||||||
return context.getExternalDictionariesLoader().getCurrentStatus(table_name) != ExternalLoader::Status::NOT_EXIST;
|
return context.getExternalDictionariesLoader().getCurrentStatus(table_name) != ExternalLoader::Status::NOT_EXIST;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool DatabaseDictionary::isDictionaryExist(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*table_name*/) const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DatabaseDictionariesIteratorPtr DatabaseDictionary::getDictionariesIterator(
|
DatabaseDictionariesIteratorPtr DatabaseDictionary::getDictionariesIterator(
|
||||||
const Context & /*context*/,
|
const Context & /*context*/,
|
||||||
const FilterByNameFunction & /*filter_by_dictionary_name*/)
|
const FilterByNameFunction & /*filter_by_dictionary_name*/)
|
||||||
@ -85,50 +72,6 @@ DatabaseDictionariesIteratorPtr DatabaseDictionary::getDictionariesIterator(
|
|||||||
return std::make_unique<DatabaseDictionariesSnapshotIterator>();
|
return std::make_unique<DatabaseDictionariesSnapshotIterator>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DatabaseDictionary::createDictionary(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*dictionary_name*/,
|
|
||||||
const ASTPtr & /*query*/)
|
|
||||||
{
|
|
||||||
throw Exception("Dictionary engine doesn't support dictionaries.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::removeDictionary(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*table_name*/)
|
|
||||||
{
|
|
||||||
throw Exception("Dictionary engine doesn't support dictionaries.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::attachDictionary(
|
|
||||||
const String & /*dictionary_name*/, const Context & /*context*/, bool /*reload*/)
|
|
||||||
{
|
|
||||||
throw Exception("Dictionary engine doesn't support dictionaries.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::detachDictionary(
|
|
||||||
const String & /*dictionary_name*/, const Context & /*context*/, bool /*reload*/)
|
|
||||||
{
|
|
||||||
throw Exception("Dictionary engine doesn't support dictionaries.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::tryGetCreateDictionaryQuery(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*table_name*/) const
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::getCreateDictionaryQuery(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*table_name*/) const
|
|
||||||
{
|
|
||||||
throw Exception("Dictionary engine doesn't support dictionaries.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
StoragePtr DatabaseDictionary::tryGetTable(
|
StoragePtr DatabaseDictionary::tryGetTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) const
|
const String & table_name) const
|
||||||
@ -154,39 +97,6 @@ bool DatabaseDictionary::empty(const Context & context) const
|
|||||||
return !context.getExternalDictionariesLoader().hasCurrentlyLoadedObjects();
|
return !context.getExternalDictionariesLoader().hasCurrentlyLoadedObjects();
|
||||||
}
|
}
|
||||||
|
|
||||||
StoragePtr DatabaseDictionary::detachTable(const String & /*table_name*/)
|
|
||||||
{
|
|
||||||
throw Exception("DatabaseDictionary: detachTable() is not supported", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::attachTable(const String & /*table_name*/, const StoragePtr & /*table*/)
|
|
||||||
{
|
|
||||||
throw Exception("DatabaseDictionary: attachTable() is not supported", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::createTable(
|
|
||||||
const Context &,
|
|
||||||
const String &,
|
|
||||||
const StoragePtr &,
|
|
||||||
const ASTPtr &)
|
|
||||||
{
|
|
||||||
throw Exception("DatabaseDictionary: createTable() is not supported", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseDictionary::removeTable(
|
|
||||||
const Context &,
|
|
||||||
const String &)
|
|
||||||
{
|
|
||||||
throw Exception("DatabaseDictionary: removeTable() is not supported", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
time_t DatabaseDictionary::getObjectMetadataModificationTime(
|
|
||||||
const Context &,
|
|
||||||
const String &)
|
|
||||||
{
|
|
||||||
return static_cast<time_t>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
||||||
const String & table_name, bool throw_on_error) const
|
const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
@ -199,7 +109,7 @@ ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
|||||||
: dictionaries.tryGetDictionary(table_name);
|
: dictionaries.tryGetDictionary(table_name);
|
||||||
|
|
||||||
auto names_and_types = StorageDictionary::getNamesAndTypes(dictionary->getStructure());
|
auto names_and_types = StorageDictionary::getNamesAndTypes(dictionary->getStructure());
|
||||||
buffer << "CREATE TABLE " << backQuoteIfNeed(name) << '.' << backQuoteIfNeed(table_name) << " (";
|
buffer << "CREATE TABLE " << backQuoteIfNeed(database_name) << '.' << backQuoteIfNeed(table_name) << " (";
|
||||||
buffer << StorageDictionary::generateNamesAndTypesDescription(names_and_types.begin(), names_and_types.end());
|
buffer << StorageDictionary::generateNamesAndTypesDescription(names_and_types.begin(), names_and_types.end());
|
||||||
buffer << ") Engine = Dictionary(" << backQuoteIfNeed(table_name) << ")";
|
buffer << ") Engine = Dictionary(" << backQuoteIfNeed(table_name) << ")";
|
||||||
}
|
}
|
||||||
@ -216,22 +126,12 @@ ASTPtr DatabaseDictionary::getCreateTableQueryImpl(const Context & context,
|
|||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::getCreateTableQuery(const Context & context, const String & table_name) const
|
|
||||||
{
|
|
||||||
return getCreateTableQueryImpl(context, table_name, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::tryGetCreateTableQuery(const Context & context, const String & table_name) const
|
|
||||||
{
|
|
||||||
return getCreateTableQueryImpl(context, table_name, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseDictionary::getCreateDatabaseQuery(const Context & /*context*/) const
|
ASTPtr DatabaseDictionary::getCreateDatabaseQuery(const Context & /*context*/) const
|
||||||
{
|
{
|
||||||
String query;
|
String query;
|
||||||
{
|
{
|
||||||
WriteBufferFromString buffer(query);
|
WriteBufferFromString buffer(query);
|
||||||
buffer << "CREATE DATABASE " << backQuoteIfNeed(name) << " ENGINE = Dictionary";
|
buffer << "CREATE DATABASE " << backQuoteIfNeed(database_name) << " ENGINE = Dictionary";
|
||||||
}
|
}
|
||||||
ParserCreateQuery parser;
|
ParserCreateQuery parser;
|
||||||
return parseQuery(parser, query.data(), query.data() + query.size(), "", 0);
|
return parseQuery(parser, query.data(), query.data() + query.size(), "", 0);
|
||||||
@ -241,9 +141,4 @@ void DatabaseDictionary::shutdown()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
String DatabaseDictionary::getDatabaseName() const
|
|
||||||
{
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -22,25 +22,17 @@ namespace DB
|
|||||||
class DatabaseDictionary : public IDatabase
|
class DatabaseDictionary : public IDatabase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DatabaseDictionary(const String & name_);
|
DatabaseDictionary(String name_);
|
||||||
|
|
||||||
String getDatabaseName() const override;
|
|
||||||
|
|
||||||
String getEngineName() const override
|
String getEngineName() const override
|
||||||
{
|
{
|
||||||
return "Dictionary";
|
return "Dictionary";
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadStoredObjects(
|
|
||||||
Context & context,
|
|
||||||
bool has_force_restore_data_flag) override;
|
|
||||||
|
|
||||||
bool isTableExist(
|
bool isTableExist(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) const override;
|
const String & table_name) const override;
|
||||||
|
|
||||||
bool isDictionaryExist(const Context & context, const String & table_name) const override;
|
|
||||||
|
|
||||||
StoragePtr tryGetTable(
|
StoragePtr tryGetTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) const override;
|
const String & table_name) const override;
|
||||||
@ -51,58 +43,19 @@ public:
|
|||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty(const Context & context) const override;
|
||||||
|
|
||||||
void createTable(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name,
|
|
||||||
const StoragePtr & table,
|
|
||||||
const ASTPtr & query) override;
|
|
||||||
|
|
||||||
void createDictionary(
|
|
||||||
const Context & context, const String & dictionary_name, const ASTPtr & query) override;
|
|
||||||
|
|
||||||
void removeTable(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) override;
|
|
||||||
|
|
||||||
void removeDictionary(const Context & context, const String & table_name) override;
|
|
||||||
|
|
||||||
void attachTable(const String & table_name, const StoragePtr & table) override;
|
|
||||||
|
|
||||||
StoragePtr detachTable(const String & table_name) override;
|
|
||||||
|
|
||||||
time_t getObjectMetadataModificationTime(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) override;
|
|
||||||
|
|
||||||
ASTPtr getCreateTableQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateTableQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
||||||
|
|
||||||
ASTPtr getCreateDictionaryQuery(const Context & context, const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateDictionaryQuery(const Context & context, const String & table_name) const override;
|
|
||||||
|
|
||||||
|
|
||||||
void attachDictionary(const String & dictionary_name, const Context & context, bool reload) override;
|
|
||||||
|
|
||||||
void detachDictionary(const String & dictionary_name, const Context & context, bool reload) override;
|
|
||||||
|
|
||||||
void shutdown() override;
|
void shutdown() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ASTPtr getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const String name;
|
|
||||||
mutable std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
|
|
||||||
Poco::Logger * log;
|
Poco::Logger * log;
|
||||||
|
|
||||||
Tables listTables(const Context & context, const FilterByNameFunction & filter_by_name);
|
Tables listTables(const Context & context, const FilterByNameFunction & filter_by_name);
|
||||||
ASTPtr getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,12 +29,12 @@ namespace ErrorCodes
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
DatabaseLazy::DatabaseLazy(const String & name_, const String & metadata_path_, time_t expiration_time_, const Context & context_)
|
DatabaseLazy::DatabaseLazy(String name_, const String & metadata_path_, time_t expiration_time_, const Context & context_)
|
||||||
: name(name_)
|
: IDatabase(std::move(name_))
|
||||||
, metadata_path(metadata_path_)
|
, metadata_path(metadata_path_)
|
||||||
, data_path("data/" + escapeForFileName(name) + "/")
|
, data_path("data/" + escapeForFileName(database_name) + "/")
|
||||||
, expiration_time(expiration_time_)
|
, expiration_time(expiration_time_)
|
||||||
, log(&Logger::get("DatabaseLazy (" + name + ")"))
|
, log(&Logger::get("DatabaseLazy (" + database_name + ")"))
|
||||||
{
|
{
|
||||||
Poco::File(context_.getPath() + getDataPath()).createDirectories();
|
Poco::File(context_.getPath() + getDataPath()).createDirectories();
|
||||||
}
|
}
|
||||||
@ -70,16 +70,6 @@ void DatabaseLazy::createTable(
|
|||||||
it->second.metadata_modification_time = DatabaseOnDisk::getObjectMetadataModificationTime(*this, table_name);
|
it->second.metadata_modification_time = DatabaseOnDisk::getObjectMetadataModificationTime(*this, table_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DatabaseLazy::createDictionary(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*dictionary_name*/,
|
|
||||||
const ASTPtr & /*query*/)
|
|
||||||
{
|
|
||||||
throw Exception("Lazy engine can be used only with *Log tables.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DatabaseLazy::removeTable(
|
void DatabaseLazy::removeTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name)
|
const String & table_name)
|
||||||
@ -88,31 +78,6 @@ void DatabaseLazy::removeTable(
|
|||||||
DatabaseOnDisk::removeTable(*this, context, table_name, log);
|
DatabaseOnDisk::removeTable(*this, context, table_name, log);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseLazy::removeDictionary(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*table_name*/)
|
|
||||||
{
|
|
||||||
throw Exception("Lazy engine can be used only with *Log tables.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseLazy::getCreateDictionaryQuery(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*table_name*/) const
|
|
||||||
{
|
|
||||||
throw Exception("Lazy engine can be used only with *Log tables.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseLazy::tryGetCreateDictionaryQuery(const Context & /*context*/, const String & /*table_name*/) const
|
|
||||||
{
|
|
||||||
return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool DatabaseLazy::isDictionaryExist(const Context & /*context*/, const String & /*table_name*/) const
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
DatabaseDictionariesIteratorPtr DatabaseLazy::getDictionariesIterator(
|
DatabaseDictionariesIteratorPtr DatabaseLazy::getDictionariesIterator(
|
||||||
const Context & /*context*/,
|
const Context & /*context*/,
|
||||||
const FilterByNameFunction & /*filter_by_dictionary_name*/)
|
const FilterByNameFunction & /*filter_by_dictionary_name*/)
|
||||||
@ -120,19 +85,6 @@ DatabaseDictionariesIteratorPtr DatabaseLazy::getDictionariesIterator(
|
|||||||
return std::make_unique<DatabaseDictionariesSnapshotIterator>();
|
return std::make_unique<DatabaseDictionariesSnapshotIterator>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void DatabaseLazy::attachDictionary(
|
|
||||||
const String & /*dictionary_name*/,
|
|
||||||
const Context & /*context*/,
|
|
||||||
bool /*load*/)
|
|
||||||
{
|
|
||||||
throw Exception("Lazy engine can be used only with *Log tables.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseLazy::detachDictionary(const String & /*dictionary_name*/, const Context & /*context*/, bool /*reload*/)
|
|
||||||
{
|
|
||||||
throw Exception("Lazy engine can be used only with *Log tables.", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseLazy::renameTable(
|
void DatabaseLazy::renameTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name,
|
const String & table_name,
|
||||||
@ -157,14 +109,9 @@ time_t DatabaseLazy::getObjectMetadataModificationTime(
|
|||||||
throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
throw Exception("Table " + backQuote(getDatabaseName()) + "." + backQuote(table_name) + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseLazy::getCreateTableQuery(const Context & context, const String & table_name) const
|
ASTPtr DatabaseLazy::getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
return DatabaseOnDisk::getCreateTableQuery(*this, context, table_name);
|
return DatabaseOnDisk::getCreateTableQueryImpl(*this, context, table_name, throw_on_error);
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseLazy::tryGetCreateTableQuery(const Context & context, const String & table_name) const
|
|
||||||
{
|
|
||||||
return DatabaseOnDisk::tryGetCreateTableQuery(*this, context, table_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseLazy::getCreateDatabaseQuery(const Context & context) const
|
ASTPtr DatabaseLazy::getCreateDatabaseQuery(const Context & context) const
|
||||||
@ -313,11 +260,6 @@ String DatabaseLazy::getMetadataPath() const
|
|||||||
return metadata_path;
|
return metadata_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
String DatabaseLazy::getDatabaseName() const
|
|
||||||
{
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
String DatabaseLazy::getObjectMetadataPath(const String & table_name) const
|
String DatabaseLazy::getObjectMetadataPath(const String & table_name) const
|
||||||
{
|
{
|
||||||
return DatabaseOnDisk::getObjectMetadataPath(*this, table_name);
|
return DatabaseOnDisk::getObjectMetadataPath(*this, table_name);
|
||||||
@ -333,14 +275,16 @@ StoragePtr DatabaseLazy::loadTable(const Context & context, const String & table
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
String table_name_;
|
|
||||||
StoragePtr table;
|
StoragePtr table;
|
||||||
Context context_copy(context); /// some tables can change context, but not LogTables
|
Context context_copy(context); /// some tables can change context, but not LogTables
|
||||||
|
|
||||||
auto ast = parseCreateQueryFromMetadataFile(table_metadata_path, log);
|
auto ast = parseCreateQueryFromMetadataFile(table_metadata_path, log);
|
||||||
if (ast)
|
if (ast)
|
||||||
std::tie(table_name_, table) = createTableFromAST(
|
{
|
||||||
ast->as<const ASTCreateQuery &>(), name, getDataPath(), context_copy, false);
|
auto & ast_create = ast->as<const ASTCreateQuery &>();
|
||||||
|
String table_data_path_relative = getDataPath() + escapeForFileName(ast_create.table) + '/';
|
||||||
|
table = createTableFromAST(ast_create, database_name, table_data_path_relative, context_copy, false).second;
|
||||||
|
}
|
||||||
|
|
||||||
if (!ast || !endsWith(table->getName(), "Log"))
|
if (!ast || !endsWith(table->getName(), "Log"))
|
||||||
throw Exception("Only *Log tables can be used with Lazy database engine.", ErrorCodes::LOGICAL_ERROR);
|
throw Exception("Only *Log tables can be used with Lazy database engine.", ErrorCodes::LOGICAL_ERROR);
|
||||||
|
@ -18,7 +18,7 @@ class DatabaseLazyIterator;
|
|||||||
class DatabaseLazy : public IDatabase
|
class DatabaseLazy : public IDatabase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
DatabaseLazy(const String & name_, const String & metadata_path_, time_t expiration_time_, const Context & context_);
|
DatabaseLazy(String name_, const String & metadata_path_, time_t expiration_time_, const Context & context_);
|
||||||
|
|
||||||
String getEngineName() const override { return "Lazy"; }
|
String getEngineName() const override { return "Lazy"; }
|
||||||
|
|
||||||
@ -32,19 +32,10 @@ public:
|
|||||||
const StoragePtr & table,
|
const StoragePtr & table,
|
||||||
const ASTPtr & query) override;
|
const ASTPtr & query) override;
|
||||||
|
|
||||||
void createDictionary(
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name,
|
|
||||||
const ASTPtr & query) override;
|
|
||||||
|
|
||||||
void removeTable(
|
void removeTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) override;
|
const String & table_name) override;
|
||||||
|
|
||||||
void removeDictionary(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) override;
|
|
||||||
|
|
||||||
void renameTable(
|
void renameTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name,
|
const String & table_name,
|
||||||
@ -64,26 +55,9 @@ public:
|
|||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) override;
|
const String & table_name) override;
|
||||||
|
|
||||||
ASTPtr getCreateTableQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateTableQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr getCreateDictionaryQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name) const override;
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateDictionaryQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name) const override;
|
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
||||||
|
|
||||||
String getDataPath() const override;
|
String getDataPath() const override;
|
||||||
String getDatabaseName() const override;
|
|
||||||
String getMetadataPath() const override;
|
String getMetadataPath() const override;
|
||||||
String getObjectMetadataPath(const String & table_name) const override;
|
String getObjectMetadataPath(const String & table_name) const override;
|
||||||
|
|
||||||
@ -93,10 +67,6 @@ public:
|
|||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) const override;
|
const String & table_name) const override;
|
||||||
|
|
||||||
bool isDictionaryExist(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
StoragePtr tryGetTable(
|
StoragePtr tryGetTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) const override;
|
const String & table_name) const override;
|
||||||
@ -111,14 +81,13 @@ public:
|
|||||||
|
|
||||||
StoragePtr detachTable(const String & table_name) override;
|
StoragePtr detachTable(const String & table_name) override;
|
||||||
|
|
||||||
void attachDictionary(const String & dictionary_name, const Context & context, bool reload) override;
|
|
||||||
|
|
||||||
void detachDictionary(const String & dictionary_name, const Context & context, bool reload) override;
|
|
||||||
|
|
||||||
void shutdown() override;
|
void shutdown() override;
|
||||||
|
|
||||||
~DatabaseLazy() override;
|
~DatabaseLazy() override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ASTPtr getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct CacheExpirationQueueElement
|
struct CacheExpirationQueueElement
|
||||||
{
|
{
|
||||||
@ -147,7 +116,6 @@ private:
|
|||||||
using TablesCache = std::unordered_map<String, CachedTable>;
|
using TablesCache = std::unordered_map<String, CachedTable>;
|
||||||
|
|
||||||
|
|
||||||
String name;
|
|
||||||
const String metadata_path;
|
const String metadata_path;
|
||||||
const String data_path;
|
const String data_path;
|
||||||
|
|
||||||
|
@ -15,16 +15,9 @@ namespace ErrorCodes
|
|||||||
|
|
||||||
DatabaseMemory::DatabaseMemory(String name_)
|
DatabaseMemory::DatabaseMemory(String name_)
|
||||||
: DatabaseWithOwnTablesBase(std::move(name_))
|
: DatabaseWithOwnTablesBase(std::move(name_))
|
||||||
, log(&Logger::get("DatabaseMemory(" + name + ")"))
|
, log(&Logger::get("DatabaseMemory(" + database_name + ")"))
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void DatabaseMemory::loadStoredObjects(
|
|
||||||
Context & /*context*/,
|
|
||||||
bool /*has_force_restore_data_flag*/)
|
|
||||||
{
|
|
||||||
/// Nothing to load.
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseMemory::createTable(
|
void DatabaseMemory::createTable(
|
||||||
const Context & /*context*/,
|
const Context & /*context*/,
|
||||||
const String & table_name,
|
const String & table_name,
|
||||||
@ -34,21 +27,6 @@ void DatabaseMemory::createTable(
|
|||||||
attachTable(table_name, table);
|
attachTable(table_name, table);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DatabaseMemory::attachDictionary(const String & /*name*/, const Context & /*context*/, bool /*reload*/)
|
|
||||||
{
|
|
||||||
throw Exception("There is no ATTACH DICTIONARY query for DatabaseMemory", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DatabaseMemory::createDictionary(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*dictionary_name*/,
|
|
||||||
const ASTPtr & /*query*/)
|
|
||||||
{
|
|
||||||
throw Exception("There is no CREATE DICTIONARY query for DatabaseMemory", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DatabaseMemory::removeTable(
|
void DatabaseMemory::removeTable(
|
||||||
const Context & /*context*/,
|
const Context & /*context*/,
|
||||||
const String & table_name)
|
const String & table_name)
|
||||||
@ -56,52 +34,11 @@ void DatabaseMemory::removeTable(
|
|||||||
detachTable(table_name);
|
detachTable(table_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void DatabaseMemory::detachDictionary(const String & /*name*/, const Context & /*context*/, bool /*reload*/)
|
|
||||||
{
|
|
||||||
throw Exception("There is no DETACH DICTIONARY query for DatabaseMemory", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void DatabaseMemory::removeDictionary(
|
|
||||||
const Context & /*context*/,
|
|
||||||
const String & /*dictionary_name*/)
|
|
||||||
{
|
|
||||||
throw Exception("There is no DROP DICTIONARY query for DatabaseMemory", ErrorCodes::UNSUPPORTED_METHOD);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
time_t DatabaseMemory::getObjectMetadataModificationTime(
|
|
||||||
const Context &, const String &)
|
|
||||||
{
|
|
||||||
return static_cast<time_t>(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseMemory::getCreateTableQuery(
|
|
||||||
const Context &,
|
|
||||||
const String &) const
|
|
||||||
{
|
|
||||||
throw Exception("There is no CREATE TABLE query for DatabaseMemory tables", ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ASTPtr DatabaseMemory::getCreateDictionaryQuery(
|
|
||||||
const Context &,
|
|
||||||
const String &) const
|
|
||||||
{
|
|
||||||
throw Exception("There is no CREATE DICTIONARY query for DatabaseMemory dictionaries", ErrorCodes::CANNOT_GET_CREATE_DICTIONARY_QUERY);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ASTPtr DatabaseMemory::getCreateDatabaseQuery(
|
ASTPtr DatabaseMemory::getCreateDatabaseQuery(
|
||||||
const Context &) const
|
const Context &) const
|
||||||
{
|
{
|
||||||
|
//FIXME
|
||||||
throw Exception("There is no CREATE DATABASE query for DatabaseMemory", ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY);
|
throw Exception("There is no CREATE DATABASE query for DatabaseMemory", ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY);
|
||||||
}
|
}
|
||||||
|
|
||||||
String DatabaseMemory::getDatabaseName() const
|
|
||||||
{
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -19,52 +19,22 @@ class DatabaseMemory : public DatabaseWithOwnTablesBase
|
|||||||
public:
|
public:
|
||||||
DatabaseMemory(String name_);
|
DatabaseMemory(String name_);
|
||||||
|
|
||||||
String getDatabaseName() const override;
|
|
||||||
|
|
||||||
String getEngineName() const override { return "Memory"; }
|
String getEngineName() const override { return "Memory"; }
|
||||||
|
|
||||||
void loadStoredObjects(
|
|
||||||
Context & context,
|
|
||||||
bool has_force_restore_data_flag) override;
|
|
||||||
|
|
||||||
void createTable(
|
void createTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name,
|
const String & table_name,
|
||||||
const StoragePtr & table,
|
const StoragePtr & table,
|
||||||
const ASTPtr & query) override;
|
const ASTPtr & query) override;
|
||||||
|
|
||||||
void createDictionary(
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name,
|
|
||||||
const ASTPtr & query) override;
|
|
||||||
|
|
||||||
void attachDictionary(
|
|
||||||
const String & name,
|
|
||||||
const Context & context,
|
|
||||||
bool reload) override;
|
|
||||||
|
|
||||||
void removeTable(
|
void removeTable(
|
||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) override;
|
const String & table_name) override;
|
||||||
|
|
||||||
void removeDictionary(
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name) override;
|
|
||||||
|
|
||||||
void detachDictionary(
|
|
||||||
const String & name,
|
|
||||||
const Context & context,
|
|
||||||
bool reload) override;
|
|
||||||
|
|
||||||
time_t getObjectMetadataModificationTime(const Context & context, const String & table_name) override;
|
|
||||||
|
|
||||||
ASTPtr getCreateTableQuery(const Context & context, const String & table_name) const override;
|
|
||||||
ASTPtr getCreateDictionaryQuery(const Context & context, const String & table_name) const override;
|
|
||||||
ASTPtr tryGetCreateTableQuery(const Context &, const String &) const override { return nullptr; }
|
|
||||||
ASTPtr tryGetCreateDictionaryQuery(const Context &, const String &) const override { return nullptr; }
|
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
||||||
|
|
||||||
|
//FIXME isDictionaryExist(...)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Poco::Logger * log;
|
Poco::Logger * log;
|
||||||
};
|
};
|
||||||
|
@ -49,7 +49,7 @@ String toQueryStringWithQuote(const std::vector<String> & quote_list)
|
|||||||
DatabaseMySQL::DatabaseMySQL(
|
DatabaseMySQL::DatabaseMySQL(
|
||||||
const Context & context_, const String & database_name_, const String & mysql_host_name_, const UInt16 & mysql_port_,
|
const Context & context_, const String & database_name_, const String & mysql_host_name_, const UInt16 & mysql_port_,
|
||||||
const String & mysql_database_name_, const String & mysql_user_name_, const String & mysql_user_password_)
|
const String & mysql_database_name_, const String & mysql_user_name_, const String & mysql_user_password_)
|
||||||
: global_context(context_), database_name(database_name_), mysql_host_name(mysql_host_name_), mysql_port(mysql_port_),
|
: IDatabase(database_name_), global_context(context_), mysql_host_name(mysql_host_name_), mysql_port(mysql_port_),
|
||||||
mysql_database_name(mysql_database_name_), mysql_user_name(mysql_user_name_), mysql_user_password(mysql_user_password_),
|
mysql_database_name(mysql_database_name_), mysql_user_name(mysql_user_name_), mysql_user_password(mysql_user_password_),
|
||||||
mysql_pool(mysql_database_name, mysql_host_name, mysql_user_name, mysql_user_password, mysql_port)
|
mysql_pool(mysql_database_name, mysql_host_name, mysql_user_name, mysql_user_password, mysql_port)
|
||||||
{
|
{
|
||||||
@ -95,14 +95,19 @@ StoragePtr DatabaseMySQL::tryGetTable(const Context &, const String & mysql_tabl
|
|||||||
return StoragePtr{};
|
return StoragePtr{};
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseMySQL::tryGetCreateTableQuery(const Context &, const String & table_name) const
|
ASTPtr DatabaseMySQL::getCreateTableQueryImpl(const Context &, const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lock(mutex);
|
std::lock_guard<std::mutex> lock(mutex);
|
||||||
|
|
||||||
fetchTablesIntoLocalCache();
|
fetchTablesIntoLocalCache();
|
||||||
|
|
||||||
if (local_tables_cache.find(table_name) == local_tables_cache.end())
|
if (local_tables_cache.find(table_name) == local_tables_cache.end())
|
||||||
throw Exception("MySQL table " + mysql_database_name + "." + table_name + " doesn't exist..", ErrorCodes::UNKNOWN_TABLE);
|
{
|
||||||
|
if (throw_on_error)
|
||||||
|
throw Exception("MySQL table " + mysql_database_name + "." + table_name + " doesn't exist..",
|
||||||
|
ErrorCodes::UNKNOWN_TABLE);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
return local_tables_cache[table_name].create_table_query;
|
return local_tables_cache[table_name].create_table_query;
|
||||||
}
|
}
|
||||||
@ -230,8 +235,8 @@ DatabaseMySQL::MySQLStorageInfo DatabaseMySQL::createStorageInfo(
|
|||||||
const String & table_name, const NamesAndTypesList & columns_name_and_type, const UInt64 & table_modification_time) const
|
const String & table_name, const NamesAndTypesList & columns_name_and_type, const UInt64 & table_modification_time) const
|
||||||
{
|
{
|
||||||
const auto & mysql_table = StorageMySQL::create(
|
const auto & mysql_table = StorageMySQL::create(
|
||||||
database_name, table_name, std::move(mysql_pool), mysql_database_name, table_name,
|
database_name, table_name, std::move(mysql_pool), mysql_database_name, table_name,
|
||||||
false, "", ColumnsDescription{columns_name_and_type}, ConstraintsDescription{}, global_context);
|
false, "", ColumnsDescription{columns_name_and_type}, ConstraintsDescription{}, global_context);
|
||||||
|
|
||||||
const auto & create_table_query = std::make_shared<ASTCreateQuery>();
|
const auto & create_table_query = std::make_shared<ASTCreateQuery>();
|
||||||
|
|
||||||
|
@ -26,8 +26,6 @@ public:
|
|||||||
|
|
||||||
String getEngineName() const override { return "MySQL"; }
|
String getEngineName() const override { return "MySQL"; }
|
||||||
|
|
||||||
String getDatabaseName() const override { return database_name; }
|
|
||||||
|
|
||||||
bool empty(const Context & context) const override;
|
bool empty(const Context & context) const override;
|
||||||
|
|
||||||
DatabaseTablesIteratorPtr getTablesIterator(const Context & context, const FilterByNameFunction & filter_by_table_name = {}) override;
|
DatabaseTablesIteratorPtr getTablesIterator(const Context & context, const FilterByNameFunction & filter_by_table_name = {}) override;
|
||||||
@ -41,70 +39,14 @@ public:
|
|||||||
|
|
||||||
bool isTableExist(const Context & context, const String & name) const override;
|
bool isTableExist(const Context & context, const String & name) const override;
|
||||||
|
|
||||||
bool isDictionaryExist(const Context &, const String &) const override { return false; }
|
|
||||||
|
|
||||||
StoragePtr tryGetTable(const Context & context, const String & name) const override;
|
StoragePtr tryGetTable(const Context & context, const String & name) const override;
|
||||||
|
|
||||||
ASTPtr tryGetCreateTableQuery(const Context & context, const String & name) const override;
|
|
||||||
|
|
||||||
ASTPtr getCreateDictionaryQuery(const Context &, const String &) const override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support dictionaries.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateDictionaryQuery(const Context &, const String &) const override { return nullptr; }
|
|
||||||
|
|
||||||
|
|
||||||
time_t getObjectMetadataModificationTime(const Context & context, const String & name) override;
|
time_t getObjectMetadataModificationTime(const Context & context, const String & name) override;
|
||||||
|
|
||||||
void shutdown() override;
|
void shutdown() override;
|
||||||
|
|
||||||
StoragePtr detachTable(const String &) override
|
protected:
|
||||||
{
|
ASTPtr getCreateTableQueryImpl(const Context & context, const String & name, bool throw_on_error) const override;
|
||||||
throw Exception("MySQL database engine does not support detach table.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void detachDictionary(const String &, const Context &, bool) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support detach dictionary.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void loadStoredObjects(Context &, bool) override
|
|
||||||
{
|
|
||||||
/// do nothing
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeTable(const Context &, const String &) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support remove table.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeDictionary(const Context &, const String &) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support remove dictionary.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void attachTable(const String &, const StoragePtr &) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support attach table.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void attachDictionary(const String &, const Context &, bool) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support attach dictionary.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void createTable(const Context &, const String &, const StoragePtr &, const ASTPtr &) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support create table.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
void createDictionary(const Context &, const String &, const ASTPtr &) override
|
|
||||||
{
|
|
||||||
throw Exception("MySQL database engine does not support create dictionary.", ErrorCodes::NOT_IMPLEMENTED);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct MySQLStorageInfo
|
struct MySQLStorageInfo
|
||||||
@ -115,7 +57,6 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
const Context global_context;
|
const Context global_context;
|
||||||
const String database_name;
|
|
||||||
const String mysql_host_name;
|
const String mysql_host_name;
|
||||||
const UInt16 mysql_port;
|
const UInt16 mysql_port;
|
||||||
const String mysql_database_name;
|
const String mysql_database_name;
|
||||||
|
@ -126,7 +126,7 @@ ASTPtr parseCreateQueryFromMetadataFile(const String & filepath, Poco::Logger *
|
|||||||
std::pair<String, StoragePtr> createTableFromAST(
|
std::pair<String, StoragePtr> createTableFromAST(
|
||||||
ASTCreateQuery ast_create_query,
|
ASTCreateQuery ast_create_query,
|
||||||
const String & database_name,
|
const String & database_name,
|
||||||
const String & database_data_path_relative,
|
const String & table_data_path_relative,
|
||||||
Context & context,
|
Context & context,
|
||||||
bool has_force_restore_data_flag)
|
bool has_force_restore_data_flag)
|
||||||
{
|
{
|
||||||
@ -149,7 +149,6 @@ std::pair<String, StoragePtr> createTableFromAST(
|
|||||||
ColumnsDescription columns = InterpreterCreateQuery::getColumnsDescription(*ast_create_query.columns_list->columns, context);
|
ColumnsDescription columns = InterpreterCreateQuery::getColumnsDescription(*ast_create_query.columns_list->columns, context);
|
||||||
ConstraintsDescription constraints = InterpreterCreateQuery::getConstraintsDescription(ast_create_query.columns_list->constraints);
|
ConstraintsDescription constraints = InterpreterCreateQuery::getConstraintsDescription(ast_create_query.columns_list->constraints);
|
||||||
|
|
||||||
String table_data_path_relative = database_data_path_relative + escapeForFileName(ast_create_query.table) + '/';
|
|
||||||
return
|
return
|
||||||
{
|
{
|
||||||
ast_create_query.table,
|
ast_create_query.table,
|
||||||
@ -425,27 +424,6 @@ ASTPtr DatabaseOnDisk::getCreateDictionaryQueryImpl(
|
|||||||
return ast;
|
return ast;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::getCreateTableQuery(const IDatabase & database, const Context & context, const String & table_name)
|
|
||||||
{
|
|
||||||
return getCreateTableQueryImpl(database, context, table_name, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::tryGetCreateTableQuery(const IDatabase & database, const Context & context, const String & table_name)
|
|
||||||
{
|
|
||||||
return getCreateTableQueryImpl(database, context, table_name, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::getCreateDictionaryQuery(const IDatabase & database, const Context & context, const String & dictionary_name)
|
|
||||||
{
|
|
||||||
return getCreateDictionaryQueryImpl(database, context, dictionary_name, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::tryGetCreateDictionaryQuery(const IDatabase & database, const Context & context, const String & dictionary_name)
|
|
||||||
{
|
|
||||||
return getCreateDictionaryQueryImpl(database, context, dictionary_name, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseOnDisk::getCreateDatabaseQuery(const IDatabase & database, const Context & /*context*/)
|
ASTPtr DatabaseOnDisk::getCreateDatabaseQuery(const IDatabase & database, const Context & /*context*/)
|
||||||
{
|
{
|
||||||
ASTPtr ast;
|
ASTPtr ast;
|
||||||
|
@ -24,7 +24,7 @@ ASTPtr parseCreateQueryFromMetadataFile(const String & filepath, Poco::Logger *
|
|||||||
std::pair<String, StoragePtr> createTableFromAST(
|
std::pair<String, StoragePtr> createTableFromAST(
|
||||||
ASTCreateQuery ast_create_query,
|
ASTCreateQuery ast_create_query,
|
||||||
const String & database_name,
|
const String & database_name,
|
||||||
const String & database_data_path_relative,
|
const String & table_data_path_relative,
|
||||||
Context & context,
|
Context & context,
|
||||||
bool has_force_restore_data_flag);
|
bool has_force_restore_data_flag);
|
||||||
|
|
||||||
@ -74,26 +74,6 @@ public:
|
|||||||
const String & to_table_name,
|
const String & to_table_name,
|
||||||
TableStructureWriteLockHolder & lock);
|
TableStructureWriteLockHolder & lock);
|
||||||
|
|
||||||
static ASTPtr getCreateTableQuery(
|
|
||||||
const IDatabase & database,
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name);
|
|
||||||
|
|
||||||
static ASTPtr tryGetCreateTableQuery(
|
|
||||||
const IDatabase & database,
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name);
|
|
||||||
|
|
||||||
static ASTPtr getCreateDictionaryQuery(
|
|
||||||
const IDatabase & database,
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name);
|
|
||||||
|
|
||||||
static ASTPtr tryGetCreateDictionaryQuery(
|
|
||||||
const IDatabase & database,
|
|
||||||
const Context & context,
|
|
||||||
const String & dictionary_name);
|
|
||||||
|
|
||||||
static ASTPtr getCreateDatabaseQuery(
|
static ASTPtr getCreateDatabaseQuery(
|
||||||
const IDatabase & database,
|
const IDatabase & database,
|
||||||
const Context & context);
|
const Context & context);
|
||||||
@ -112,7 +92,6 @@ public:
|
|||||||
using IteratingFunction = std::function<void(const String &)>;
|
using IteratingFunction = std::function<void(const String &)>;
|
||||||
static void iterateMetadataFiles(const IDatabase & database, Poco::Logger * log, const Context & context, const IteratingFunction & iterating_function);
|
static void iterateMetadataFiles(const IDatabase & database, Poco::Logger * log, const Context & context, const IteratingFunction & iterating_function);
|
||||||
|
|
||||||
private:
|
|
||||||
static ASTPtr getCreateTableQueryImpl(
|
static ASTPtr getCreateTableQueryImpl(
|
||||||
const IDatabase & database,
|
const IDatabase & database,
|
||||||
const Context & context,
|
const Context & context,
|
||||||
|
@ -54,7 +54,7 @@ void loadObject(
|
|||||||
Context & context,
|
Context & context,
|
||||||
const ASTCreateQuery & query,
|
const ASTCreateQuery & query,
|
||||||
DatabaseOrdinary & database,
|
DatabaseOrdinary & database,
|
||||||
const String database_data_path,
|
const String & database_data_path_relative,
|
||||||
const String & database_name,
|
const String & database_name,
|
||||||
bool has_force_restore_data_flag)
|
bool has_force_restore_data_flag)
|
||||||
try
|
try
|
||||||
@ -66,10 +66,8 @@ try
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
String table_name;
|
String table_data_path_relative = database_data_path_relative + escapeForFileName(query.table) + '/';
|
||||||
StoragePtr table;
|
auto [table_name, table] = createTableFromAST(query, database_name, table_data_path_relative, context, has_force_restore_data_flag);
|
||||||
std::tie(table_name, table)
|
|
||||||
= createTableFromAST(query, database_name, database_data_path, context, has_force_restore_data_flag);
|
|
||||||
database.attachTable(table_name, table);
|
database.attachTable(table_name, table);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -97,8 +95,8 @@ void logAboutProgress(Poco::Logger * log, size_t processed, size_t total, Atomic
|
|||||||
DatabaseOrdinary::DatabaseOrdinary(String name_, const String & metadata_path_, const Context & context_)
|
DatabaseOrdinary::DatabaseOrdinary(String name_, const String & metadata_path_, const Context & context_)
|
||||||
: DatabaseWithOwnTablesBase(std::move(name_))
|
: DatabaseWithOwnTablesBase(std::move(name_))
|
||||||
, metadata_path(metadata_path_)
|
, metadata_path(metadata_path_)
|
||||||
, data_path("data/" + escapeForFileName(name) + "/")
|
, data_path("data/" + escapeForFileName(database_name) + "/")
|
||||||
, log(&Logger::get("DatabaseOrdinary (" + name + ")"))
|
, log(&Logger::get("DatabaseOrdinary (" + database_name + ")"))
|
||||||
{
|
{
|
||||||
Poco::File(context_.getPath() + getDataPath()).createDirectories();
|
Poco::File(context_.getPath() + getDataPath()).createDirectories();
|
||||||
}
|
}
|
||||||
@ -257,25 +255,14 @@ time_t DatabaseOrdinary::getObjectMetadataModificationTime(
|
|||||||
return DatabaseOnDisk::getObjectMetadataModificationTime(*this, table_name);
|
return DatabaseOnDisk::getObjectMetadataModificationTime(*this, table_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOrdinary::getCreateTableQuery(const Context & context, const String & table_name) const
|
ASTPtr DatabaseOrdinary::getCreateTableQueryImpl(const Context & context, const String & table_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
return DatabaseOnDisk::getCreateTableQuery(*this, context, table_name);
|
return DatabaseOnDisk::getCreateTableQueryImpl(*this, context, table_name, throw_on_error);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOrdinary::tryGetCreateTableQuery(const Context & context, const String & table_name) const
|
ASTPtr DatabaseOrdinary::getCreateDictionaryQueryImpl(const Context & context, const String & dictionary_name, bool throw_on_error) const
|
||||||
{
|
{
|
||||||
return DatabaseOnDisk::tryGetCreateTableQuery(*this, context, table_name);
|
return DatabaseOnDisk::getCreateDictionaryQueryImpl(*this, context, dictionary_name, throw_on_error);
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
ASTPtr DatabaseOrdinary::getCreateDictionaryQuery(const Context & context, const String & dictionary_name) const
|
|
||||||
{
|
|
||||||
return DatabaseOnDisk::getCreateDictionaryQuery(*this, context, dictionary_name);
|
|
||||||
}
|
|
||||||
|
|
||||||
ASTPtr DatabaseOrdinary::tryGetCreateDictionaryQuery(const Context & context, const String & dictionary_name) const
|
|
||||||
{
|
|
||||||
return DatabaseOnDisk::tryGetCreateTableQuery(*this, context, dictionary_name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ASTPtr DatabaseOrdinary::getCreateDatabaseQuery(const Context & context) const
|
ASTPtr DatabaseOrdinary::getCreateDatabaseQuery(const Context & context) const
|
||||||
@ -360,11 +347,6 @@ String DatabaseOrdinary::getMetadataPath() const
|
|||||||
return metadata_path;
|
return metadata_path;
|
||||||
}
|
}
|
||||||
|
|
||||||
String DatabaseOrdinary::getDatabaseName() const
|
|
||||||
{
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
String DatabaseOrdinary::getObjectMetadataPath(const String & table_name) const
|
String DatabaseOrdinary::getObjectMetadataPath(const String & table_name) const
|
||||||
{
|
{
|
||||||
return DatabaseOnDisk::getObjectMetadataPath(*this, table_name);
|
return DatabaseOnDisk::getObjectMetadataPath(*this, table_name);
|
||||||
|
@ -60,31 +60,21 @@ public:
|
|||||||
const Context & context,
|
const Context & context,
|
||||||
const String & table_name) override;
|
const String & table_name) override;
|
||||||
|
|
||||||
ASTPtr getCreateTableQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateTableQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & table_name) const override;
|
|
||||||
|
|
||||||
ASTPtr tryGetCreateDictionaryQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & name) const override;
|
|
||||||
|
|
||||||
ASTPtr getCreateDictionaryQuery(
|
|
||||||
const Context & context,
|
|
||||||
const String & name) const override;
|
|
||||||
|
|
||||||
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
ASTPtr getCreateDatabaseQuery(const Context & context) const override;
|
||||||
|
|
||||||
String getDataPath() const override;
|
String getDataPath() const override;
|
||||||
String getDatabaseName() const override;
|
|
||||||
String getMetadataPath() const override;
|
String getMetadataPath() const override;
|
||||||
String getObjectMetadataPath(const String & table_name) const override;
|
String getObjectMetadataPath(const String & table_name) const override;
|
||||||
|
|
||||||
void drop(const Context & context) override;
|
void drop(const Context & context) override;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
ASTPtr getCreateTableQueryImpl(const Context & context, const String & table_name,
|
||||||
|
bool throw_on_error) const override;
|
||||||
|
|
||||||
|
ASTPtr getCreateDictionaryQueryImpl(const Context & context, const String & name,
|
||||||
|
bool throw_on_error) const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
const String metadata_path;
|
const String metadata_path;
|
||||||
const String data_path;
|
const String data_path;
|
||||||
|
@ -142,11 +142,11 @@ StoragePtr DatabaseWithOwnTablesBase::detachTable(const String & table_name)
|
|||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
if (dictionaries.count(table_name))
|
if (dictionaries.count(table_name))
|
||||||
throw Exception("Cannot detach dictionary " + name + "." + table_name + " as table, use DETACH DICTIONARY query.", ErrorCodes::UNKNOWN_TABLE);
|
throw Exception("Cannot detach dictionary " + database_name + "." + table_name + " as table, use DETACH DICTIONARY query.", ErrorCodes::UNKNOWN_TABLE);
|
||||||
|
|
||||||
auto it = tables.find(table_name);
|
auto it = tables.find(table_name);
|
||||||
if (it == tables.end())
|
if (it == tables.end())
|
||||||
throw Exception("Table " + name + "." + table_name + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
throw Exception("Table " + database_name + "." + table_name + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||||
res = it->second;
|
res = it->second;
|
||||||
tables.erase(it);
|
tables.erase(it);
|
||||||
}
|
}
|
||||||
@ -160,7 +160,7 @@ void DatabaseWithOwnTablesBase::detachDictionary(const String & dictionary_name,
|
|||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
auto it = dictionaries.find(dictionary_name);
|
auto it = dictionaries.find(dictionary_name);
|
||||||
if (it == dictionaries.end())
|
if (it == dictionaries.end())
|
||||||
throw Exception("Dictionary " + name + "." + dictionary_name + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
throw Exception("Dictionary " + database_name + "." + dictionary_name + " doesn't exist.", ErrorCodes::UNKNOWN_TABLE);
|
||||||
dictionaries.erase(it);
|
dictionaries.erase(it);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -173,7 +173,7 @@ void DatabaseWithOwnTablesBase::attachTable(const String & table_name, const Sto
|
|||||||
{
|
{
|
||||||
std::lock_guard lock(mutex);
|
std::lock_guard lock(mutex);
|
||||||
if (!tables.emplace(table_name, table).second)
|
if (!tables.emplace(table_name, table).second)
|
||||||
throw Exception("Table " + name + "." + table_name + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
throw Exception("Table " + database_name + "." + table_name + " already exists.", ErrorCodes::TABLE_ALREADY_EXISTS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -51,13 +51,11 @@ public:
|
|||||||
virtual ~DatabaseWithOwnTablesBase() override;
|
virtual ~DatabaseWithOwnTablesBase() override;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
String name;
|
|
||||||
|
|
||||||
mutable std::mutex mutex;
|
mutable std::mutex mutex;
|
||||||
Tables tables;
|
Tables tables;
|
||||||
Dictionaries dictionaries;
|
Dictionaries dictionaries;
|
||||||
|
|
||||||
DatabaseWithOwnTablesBase(String name_) : name(std::move(name_)) { }
|
DatabaseWithOwnTablesBase(String name_) : IDatabase(std::move(name_)) { }
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -25,6 +25,9 @@ using Dictionaries = std::set<String>;
|
|||||||
namespace ErrorCodes
|
namespace ErrorCodes
|
||||||
{
|
{
|
||||||
extern const int NOT_IMPLEMENTED;
|
extern const int NOT_IMPLEMENTED;
|
||||||
|
extern const int CANNOT_GET_CREATE_TABLE_QUERY;
|
||||||
|
extern const int CANNOT_GET_CREATE_TABLE_QUERY;
|
||||||
|
extern const int CANNOT_GET_CREATE_DICTIONARY_QUERY;
|
||||||
}
|
}
|
||||||
|
|
||||||
class IDatabaseTablesIterator
|
class IDatabaseTablesIterator
|
||||||
@ -96,14 +99,15 @@ using DatabaseDictionariesIteratorPtr = std::unique_ptr<DatabaseDictionariesSnap
|
|||||||
class IDatabase : public std::enable_shared_from_this<IDatabase>
|
class IDatabase : public std::enable_shared_from_this<IDatabase>
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
IDatabase() = delete;
|
||||||
|
IDatabase(String database_name_) : database_name(std::move(database_name_)) {}
|
||||||
|
|
||||||
/// Get name of database engine.
|
/// Get name of database engine.
|
||||||
virtual String getEngineName() const = 0;
|
virtual String getEngineName() const = 0;
|
||||||
|
|
||||||
/// Load a set of existing tables.
|
/// Load a set of existing tables.
|
||||||
/// You can call only once, right after the object is created.
|
/// You can call only once, right after the object is created.
|
||||||
virtual void loadStoredObjects(
|
virtual void loadStoredObjects(Context & /*context*/, bool /*has_force_restore_data_flag*/) {}
|
||||||
Context & context,
|
|
||||||
bool has_force_restore_data_flag) = 0;
|
|
||||||
|
|
||||||
/// Check the existence of the table.
|
/// Check the existence of the table.
|
||||||
virtual bool isTableExist(
|
virtual bool isTableExist(
|
||||||
@ -112,8 +116,11 @@ public:
|
|||||||
|
|
||||||
/// Check the existence of the dictionary
|
/// Check the existence of the dictionary
|
||||||
virtual bool isDictionaryExist(
|
virtual bool isDictionaryExist(
|
||||||
const Context & context,
|
const Context & /*context*/,
|
||||||
const String & name) const = 0;
|
const String & /*name*/) const
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the table for work. Return nullptr if there is no table.
|
/// Get the table for work. Return nullptr if there is no table.
|
||||||
virtual StoragePtr tryGetTable(
|
virtual StoragePtr tryGetTable(
|
||||||
@ -140,39 +147,63 @@ public:
|
|||||||
|
|
||||||
/// Add the table to the database. Record its presence in the metadata.
|
/// Add the table to the database. Record its presence in the metadata.
|
||||||
virtual void createTable(
|
virtual void createTable(
|
||||||
const Context & context,
|
const Context & /*context*/,
|
||||||
const String & name,
|
const String & /*name*/,
|
||||||
const StoragePtr & table,
|
const StoragePtr & /*table*/,
|
||||||
const ASTPtr & query) = 0;
|
const ASTPtr & /*query*/)
|
||||||
|
{
|
||||||
|
throw Exception("There is no CREATE TABLE query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Add the dictionary to the database. Record its presence in the metadata.
|
/// Add the dictionary to the database. Record its presence in the metadata.
|
||||||
virtual void createDictionary(
|
virtual void createDictionary(
|
||||||
const Context & context,
|
const Context & /*context*/,
|
||||||
const String & dictionary_name,
|
const String & /*dictionary_name*/,
|
||||||
const ASTPtr & query) = 0;
|
const ASTPtr & /*query*/)
|
||||||
|
{
|
||||||
|
throw Exception("There is no CREATE DICTIONARY query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Delete the table from the database. Delete the metadata.
|
/// Delete the table from the database. Delete the metadata.
|
||||||
virtual void removeTable(
|
virtual void removeTable(
|
||||||
const Context & context,
|
const Context & /*context*/,
|
||||||
const String & name) = 0;
|
const String & /*name*/)
|
||||||
|
{
|
||||||
|
throw Exception("There is no DROP TABLE query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Delete the dictionary from the database. Delete the metadata.
|
/// Delete the dictionary from the database. Delete the metadata.
|
||||||
virtual void removeDictionary(
|
virtual void removeDictionary(
|
||||||
const Context & context,
|
const Context & /*context*/,
|
||||||
const String & dictionary_name) = 0;
|
const String & /*dictionary_name*/)
|
||||||
|
{
|
||||||
|
throw Exception("There is no DROP DICTIONARY query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Add a table to the database, but do not add it to the metadata. The database may not support this method.
|
/// Add a table to the database, but do not add it to the metadata. The database may not support this method.
|
||||||
virtual void attachTable(const String & name, const StoragePtr & table) = 0;
|
virtual void attachTable(const String & /*name*/, const StoragePtr & /*table*/)
|
||||||
|
{
|
||||||
|
throw Exception("There is no ATTACH TABLE query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Add dictionary to the database, but do not add it to the metadata. The database may not support this method.
|
/// Add dictionary to the database, but do not add it to the metadata. The database may not support this method.
|
||||||
/// load is false when we starting up and lazy_load is true, so we don't want to load dictionaries synchronously.
|
/// load is false when we starting up and lazy_load is true, so we don't want to load dictionaries synchronously.
|
||||||
virtual void attachDictionary(const String & name, const Context & context, bool reload = true) = 0;
|
virtual void attachDictionary(const String & /*name*/, const Context & /*context*/, [[maybe_unused]] bool reload = true)
|
||||||
|
{
|
||||||
|
throw Exception("There is no ATTACH DICTIONARY query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Forget about the table without deleting it, and return it. The database may not support this method.
|
/// Forget about the table without deleting it, and return it. The database may not support this method.
|
||||||
virtual StoragePtr detachTable(const String & name) = 0;
|
virtual StoragePtr detachTable(const String & /*name*/)
|
||||||
|
{
|
||||||
|
throw Exception("There is no DETACH TABLE query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Forget about the dictionary without deleting it, and return it. The database may not support this method.
|
/// Forget about the dictionary without deleting it, and return it. The database may not support this method.
|
||||||
virtual void detachDictionary(const String & name, const Context & context, bool reload = true) = 0;
|
virtual void detachDictionary(const String & /*name*/, const Context & /*context*/, [[maybe_unused]] bool reload = true)
|
||||||
|
{
|
||||||
|
throw Exception("There is no DETACH DICTIONARY query for Database" + getEngineName(), ErrorCodes::NOT_IMPLEMENTED);
|
||||||
|
}
|
||||||
|
|
||||||
/// Rename the table and possibly move the table to another database.
|
/// Rename the table and possibly move the table to another database.
|
||||||
virtual void renameTable(
|
virtual void renameTable(
|
||||||
@ -201,31 +232,38 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns time of table's metadata change, 0 if there is no corresponding metadata file.
|
/// Returns time of table's metadata change, 0 if there is no corresponding metadata file.
|
||||||
virtual time_t getObjectMetadataModificationTime(
|
virtual time_t getObjectMetadataModificationTime(const Context & /*context*/, const String & /*name*/)
|
||||||
const Context & context,
|
{
|
||||||
const String & name) = 0;
|
return static_cast<time_t>(0);
|
||||||
|
}
|
||||||
|
|
||||||
/// Get the CREATE TABLE query for the table. It can also provide information for detached tables for which there is metadata.
|
/// Get the CREATE TABLE query for the table. It can also provide information for detached tables for which there is metadata.
|
||||||
virtual ASTPtr tryGetCreateTableQuery(const Context & context, const String & name) const = 0;
|
ASTPtr tryGetCreateTableQuery(const Context & context, const String & name) const noexcept
|
||||||
|
|
||||||
virtual ASTPtr getCreateTableQuery(const Context & context, const String & name) const
|
|
||||||
{
|
{
|
||||||
return tryGetCreateTableQuery(context, name);
|
return getCreateTableQueryImpl(context, name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTPtr getCreateTableQuery(const Context & context, const String & name) const
|
||||||
|
{
|
||||||
|
return getCreateTableQueryImpl(context, name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the CREATE DICTIONARY query for the dictionary. Returns nullptr if dictionary doesn't exists.
|
/// Get the CREATE DICTIONARY query for the dictionary. Returns nullptr if dictionary doesn't exists.
|
||||||
virtual ASTPtr tryGetCreateDictionaryQuery(const Context & context, const String & name) const = 0;
|
ASTPtr tryGetCreateDictionaryQuery(const Context & context, const String & name) const noexcept
|
||||||
|
|
||||||
virtual ASTPtr getCreateDictionaryQuery(const Context & context, const String & name) const
|
|
||||||
{
|
{
|
||||||
return tryGetCreateDictionaryQuery(context, name);
|
return getCreateDictionaryQueryImpl(context, name, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASTPtr getCreateDictionaryQuery(const Context & context, const String & name) const
|
||||||
|
{
|
||||||
|
return getCreateDictionaryQueryImpl(context, name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get the CREATE DATABASE query for current database.
|
/// Get the CREATE DATABASE query for current database.
|
||||||
virtual ASTPtr getCreateDatabaseQuery(const Context & context) const = 0;
|
virtual ASTPtr getCreateDatabaseQuery(const Context & context) const = 0;
|
||||||
|
|
||||||
/// Get name of database.
|
/// Get name of database.
|
||||||
virtual String getDatabaseName() const = 0;
|
String getDatabaseName() const { return database_name; }
|
||||||
/// Returns path for persistent data storage if the database supports it, empty string otherwise
|
/// Returns path for persistent data storage if the database supports it, empty string otherwise
|
||||||
virtual String getDataPath() const { return {}; }
|
virtual String getDataPath() const { return {}; }
|
||||||
/// Returns metadata path if the database supports it, empty string otherwise
|
/// Returns metadata path if the database supports it, empty string otherwise
|
||||||
@ -240,6 +278,23 @@ public:
|
|||||||
virtual void drop(const Context & /*context*/) {}
|
virtual void drop(const Context & /*context*/) {}
|
||||||
|
|
||||||
virtual ~IDatabase() {}
|
virtual ~IDatabase() {}
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual ASTPtr getCreateTableQueryImpl(const Context & /*context*/, const String & /*name*/, bool throw_on_error) const
|
||||||
|
{
|
||||||
|
if (throw_on_error)
|
||||||
|
throw Exception("There is no SHOW CREATE TABLE query for Database" + getEngineName(), ErrorCodes::CANNOT_GET_CREATE_TABLE_QUERY);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ASTPtr getCreateDictionaryQueryImpl(const Context & /*context*/, const String & /*name*/, bool throw_on_error) const
|
||||||
|
{
|
||||||
|
if (throw_on_error)
|
||||||
|
throw Exception("There is no SHOW CREATE DICTIONARY query for Database" + getEngineName(), ErrorCodes::CANNOT_GET_CREATE_DICTIONARY_QUERY);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
String database_name;
|
||||||
};
|
};
|
||||||
|
|
||||||
using DatabasePtr = std::shared_ptr<IDatabase>;
|
using DatabasePtr = std::shared_ptr<IDatabase>;
|
||||||
|
Loading…
Reference in New Issue
Block a user