From 583f4c114e9c18f46907e416e11ac5092ac9097b Mon Sep 17 00:00:00 2001 From: Michael Kolupaev Date: Mon, 11 Aug 2014 19:59:01 +0400 Subject: [PATCH] Merge --- dbms/include/DB/Common/Macros.h | 27 +++++++++ dbms/include/DB/Interpreters/Context.h | 7 ++- dbms/src/Common/Macros.cpp | 60 +++++++++++++++++++ dbms/src/Interpreters/Context.cpp | 11 ++++ dbms/src/Server/Server.cpp | 3 + .../Storages/StorageReplicatedMergeTree.cpp | 5 +- 6 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 dbms/include/DB/Common/Macros.h create mode 100644 dbms/src/Common/Macros.cpp diff --git a/dbms/include/DB/Common/Macros.h b/dbms/include/DB/Common/Macros.h new file mode 100644 index 00000000000..2855eb6b750 --- /dev/null +++ b/dbms/include/DB/Common/Macros.h @@ -0,0 +1,27 @@ +#pragma once + +#include +#include +#include + +namespace DB +{ + +/** Раскрывает в строке макросы из конфига. + */ +class Macros +{ +public: + Macros(); + Macros(const Poco::Util::AbstractConfiguration & config, const String & key); + + /// Заменить в строке подстроки вида {macro_name} на значение для macro_name, полученное из конфига. + String expand(const String & s) const; + +private: + typedef std::map MacroMap; + + MacroMap macros; +}; + +} diff --git a/dbms/include/DB/Interpreters/Context.h b/dbms/include/DB/Interpreters/Context.h index b837c7fc673..5dded8069ca 100644 --- a/dbms/include/DB/Interpreters/Context.h +++ b/dbms/include/DB/Interpreters/Context.h @@ -9,6 +9,7 @@ #include #include +#include #include #include #include @@ -95,8 +96,9 @@ struct ContextShared ViewDependencies view_dependencies; /// Текущие зависимости ConfigurationPtr users_config; /// Конфиг с секциями users, profiles и quotas. InterserverIOHandler interserver_io_handler; /// Обработчик для межсерверной передачи данных. - String default_replica_name; /// Имя реплики из конфига. + String default_replica_name; /// Имя реплики из конфига. DEPRECATED BackgroundProcessingPoolPtr background_pool; /// Пул потоков для фоновой работы, выполняемой таблицами. + Macros macros; /// Подстановки из конфига. /// Кластеры для distributed таблиц /// Создаются при создании Distributed таблиц, так как нужно дождаться пока будут выставлены Settings @@ -242,6 +244,9 @@ public: String getDefaultReplicaName() const; void setDefaultReplicaName(const String & name); + const Macros & getMacros() const; + void setMacros(Macros && macros); + Settings getSettings() const; void setSettings(const Settings & settings_); diff --git a/dbms/src/Common/Macros.cpp b/dbms/src/Common/Macros.cpp new file mode 100644 index 00000000000..49b76ebb11d --- /dev/null +++ b/dbms/src/Common/Macros.cpp @@ -0,0 +1,60 @@ +#include +#include +#include + +namespace DB +{ + +Macros::Macros() {} + +Macros::Macros(const Poco::Util::AbstractConfiguration & config, const String & root_key) +{ + Poco::Util::AbstractConfiguration::Keys keys; + config.keys(root_key, keys); + for (const String & key : keys) + { + macros[key] = config.getString(root_key + "." + key); + } +} + +String Macros::expand(const String & s) const +{ + if (s.find('{') == String::npos) + return s; + + String res; + size_t pos = 0; + while (true) + { + size_t begin = s.find('{', pos); + + if (begin == String::npos) + { + res.append(s, pos, String::npos); + break; + } + else + { + res.append(s, pos, begin - pos); + } + + ++begin; + size_t end = s.find('}', begin); + if (end == String::npos) + throw Exception("Unbalanced { and } in string with macros: \"" + s + "\"", ErrorCodes::SYNTAX_ERROR); + + String macro_name = s.substr(begin, end - begin); + + auto it = macros.find(macro_name); + if (it == macros.end()) + throw Exception("No macro " + macro_name + " in config", ErrorCodes::SYNTAX_ERROR); + + res += it->second; + + pos = end + 1; + } + + return res; +} + +} diff --git a/dbms/src/Interpreters/Context.cpp b/dbms/src/Interpreters/Context.cpp index e35f923b089..1732c05280e 100644 --- a/dbms/src/Interpreters/Context.cpp +++ b/dbms/src/Interpreters/Context.cpp @@ -459,6 +459,17 @@ void Context::setDefaultReplicaName(const String & name) shared->default_replica_name = name; } +const Macros& Context::getMacros() const +{ + return shared->macros; +} + +void Context::setMacros(Macros && macros) +{ + /// Полагаемся, что это присваивание происходит один раз при старте сервера. Если это не так, нужно использовать мьютекс. + shared->macros = macros; +} + Context & Context::getSessionContext() { diff --git a/dbms/src/Server/Server.cpp b/dbms/src/Server/Server.cpp index 7263154c7bf..ebae073cbd8 100644 --- a/dbms/src/Server/Server.cpp +++ b/dbms/src/Server/Server.cpp @@ -373,6 +373,9 @@ int Server::main(const std::vector & args) if (config().has("replica_name")) global_context->setDefaultReplicaName(config().getString("replica_name")); + if (config().has("macros")) + global_context->setMacros(Macros(config(), "macros")); + std::string users_config_path = config().getString("users_config", config().getString("config-file", "config.xml")); auto users_config_reloader = stdext::make_unique(users_config_path, global_context.get()); diff --git a/dbms/src/Storages/StorageReplicatedMergeTree.cpp b/dbms/src/Storages/StorageReplicatedMergeTree.cpp index 3ddb8c49400..fab1636d561 100644 --- a/dbms/src/Storages/StorageReplicatedMergeTree.cpp +++ b/dbms/src/Storages/StorageReplicatedMergeTree.cpp @@ -45,8 +45,9 @@ StorageReplicatedMergeTree::StorageReplicatedMergeTree( const MergeTreeSettings & settings_) : context(context_), zookeeper(context.getZooKeeper()), database_name(database_name_), - table_name(name_), full_path(path_ + escapeForFileName(table_name) + '/'), zookeeper_path(zookeeper_path_), - replica_name(replica_name_), + table_name(name_), full_path(path_ + escapeForFileName(table_name) + '/'), + zookeeper_path(context.getMacros().expand(zookeeper_path_)), + replica_name(context.getMacros().expand(replica_name_)), data( full_path, columns_, context_, primary_expr_ast_, date_column_name_, sampling_expression_, index_granularity_, mode_, sign_column_, settings_, database_name_ + "." + table_name, true, std::bind(&StorageReplicatedMergeTree::enqueuePartForCheck, this, std::placeholders::_1)),