mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-24 02:30:51 +00:00
76 lines
2.3 KiB
C++
76 lines
2.3 KiB
C++
#include "HandlerFactory.h"
|
|
#include <Common/HTMLForm.h>
|
|
#include "Handlers.h"
|
|
|
|
#include <Dictionaries/validateODBCConnectionString.h>
|
|
#include <Poco/Ext/SessionPoolHelpers.h>
|
|
#include <Poco/Net/HTTPServerRequest.h>
|
|
#include <common/logger_useful.h>
|
|
|
|
namespace DB
|
|
{
|
|
namespace
|
|
{
|
|
std::string buildConnectionString(const std::string & DSN, const std::string & database)
|
|
{
|
|
std::stringstream ss;
|
|
ss << "DSN=" << DSN << ";DATABASE=" << database;
|
|
return ss.str();
|
|
}
|
|
}
|
|
Poco::Net::HTTPRequestHandler * HandlerFactory::createRequestHandler(const Poco::Net::HTTPServerRequest & request)
|
|
{
|
|
const auto & uri = request.getURI();
|
|
LOG_TRACE(log, "Request URI: " + uri);
|
|
|
|
if (uri == "/ping" && request.getMethod() == Poco::Net::HTTPRequest::HTTP_GET)
|
|
return new PingHandler(keep_alive_timeout);
|
|
|
|
HTMLForm params(request);
|
|
std::string DSN = params.get("DSN", "");
|
|
std::string database = params.get("database", "");
|
|
|
|
std::string max_block_size_str = params.get("max_block_size", "");
|
|
std::string format = params.get("format", "RowBinary");
|
|
|
|
std::string connection_string = buildConnectionString(DSN, database);
|
|
|
|
LOG_TRACE(log, "Connection string:" << connection_string);
|
|
|
|
std::shared_ptr<Poco::Data::SessionPool> pool = nullptr;
|
|
if (!pool_map.count(connection_string))
|
|
try
|
|
{
|
|
std::string validated = validateODBCConnectionString(connection_string);
|
|
pool
|
|
= createAndCheckResizePocoSessionPool([validated] { return std::make_shared<Poco::Data::SessionPool>("ODBC", validated); });
|
|
pool_map[connection_string] = pool;
|
|
}
|
|
catch (const Exception & ex)
|
|
{
|
|
LOG_WARNING(log, "Connection string validation failed: " + ex.message());
|
|
}
|
|
else
|
|
{
|
|
pool = pool_map[connection_string];
|
|
}
|
|
|
|
size_t max_block_size = DEFAULT_BLOCK_SIZE;
|
|
|
|
if (!max_block_size_str.empty())
|
|
try
|
|
{
|
|
max_block_size = std::stoul(max_block_size_str);
|
|
}
|
|
catch (...)
|
|
{
|
|
tryLogCurrentException(log);
|
|
}
|
|
|
|
if (request.getMethod() == Poco::Net::HTTPRequest::HTTP_POST)
|
|
return new ODBCHandler(pool, format, max_block_size, keep_alive_timeout, context);
|
|
|
|
return nullptr;
|
|
}
|
|
}
|