dbms: storing settings and default database in client [METR-8983]

This commit is contained in:
Sergey Fedorov 2014-04-18 17:59:39 +04:00
parent 88644b2377
commit 4c7dd4e269
3 changed files with 27 additions and 0 deletions

View File

@ -78,6 +78,9 @@ public:
Packet() : type(Protocol::Server::Hello) {}
};
/// Изменить базу данных по умолчанию. Изменения начинают использоваться только при следующем переподключении.
void setDefaultDatabase(const String & database);
void getServerVersion(String & name, UInt64 & version_major, UInt64 & version_minor, UInt64 & revision);
/// Адрес сервера - для сообщений в логе и в эксепшенах.

View File

@ -465,6 +465,24 @@ private:
written_progress_chars = 0;
written_first_block = false;
const ASTSetQuery * set_query = dynamic_cast<const ASTSetQuery *>(&*parsed_query);
if (set_query)
{
/// Запоминаем все изменения в настройках, чтобы не потерять их при разрыве соединения.
for (ASTSetQuery::Changes::const_iterator it = set_query->changes.begin(); it != set_query->changes.end(); ++it)
context.setSetting(it->name, it->value);
}
const ASTUseQuery * use_query = dynamic_cast<const ASTUseQuery *>(&*parsed_query);
if (use_query)
{
const String & new_database = use_query->database;
/// Если клиент инициирует пересоединение, он берет настройки из конфига
config().setString("database", new_database);
/// Если connection инициирует пересоединение, он использует свою переменную
connection->setDefaultDatabase(new_database);
}
/// Запрос INSERT (но только тот, что требует передачи данных - не INSERT SELECT), обрабатывается отдельным способом.
const ASTInsertQuery * insert = dynamic_cast<const ASTInsertQuery *>(&*parsed_query);

View File

@ -128,6 +128,12 @@ void Connection::receiveHello()
}
void Connection::setDefaultDatabase(const String & database)
{
default_database = database;
}
void Connection::getServerVersion(String & name, UInt64 & version_major, UInt64 & version_minor, UInt64 & revision)
{
if (!connected)