refactor IDatabase

This commit is contained in:
Alexander Tokmakov 2019-11-01 15:47:55 +03:00
parent 9bbeb6359a
commit d0af0c8703
15 changed files with 150 additions and 555 deletions

View File

@ -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;
}
} }

View File

@ -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;
}; };
} }

View File

@ -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);

View File

@ -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;

View File

@ -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;
}
} }

View File

@ -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;
}; };

View File

@ -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>();

View File

@ -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;

View File

@ -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;

View File

@ -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,

View File

@ -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);

View File

@ -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;

View File

@ -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);
} }

View File

@ -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_)) { }
}; };
} }

View File

@ -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>;