mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-30 05:30:51 +00:00
MongoDB SSL Connection
This commit is contained in:
parent
9a20b9f0c6
commit
fce9351256
@ -1,4 +1,5 @@
|
|||||||
#include "StorageMongoDB.h"
|
#include "StorageMongoDB.h"
|
||||||
|
#include "StorageMongoDBSocketFactory.h"
|
||||||
|
|
||||||
#include <Poco/MongoDB/Connection.h>
|
#include <Poco/MongoDB/Connection.h>
|
||||||
#include <Poco/MongoDB/Cursor.h>
|
#include <Poco/MongoDB/Cursor.h>
|
||||||
@ -33,6 +34,7 @@ StorageMongoDB::StorageMongoDB(
|
|||||||
const std::string & collection_name_,
|
const std::string & collection_name_,
|
||||||
const std::string & username_,
|
const std::string & username_,
|
||||||
const std::string & password_,
|
const std::string & password_,
|
||||||
|
const std::string & options_,
|
||||||
const ColumnsDescription & columns_,
|
const ColumnsDescription & columns_,
|
||||||
const ConstraintsDescription & constraints_,
|
const ConstraintsDescription & constraints_,
|
||||||
const String & comment)
|
const String & comment)
|
||||||
@ -43,6 +45,8 @@ StorageMongoDB::StorageMongoDB(
|
|||||||
, collection_name(collection_name_)
|
, collection_name(collection_name_)
|
||||||
, username(username_)
|
, username(username_)
|
||||||
, password(password_)
|
, password(password_)
|
||||||
|
, options(options_)
|
||||||
|
, uri("mongodb://" + username_ + ":" + password_ + "@" + host_ + ":" + std::to_string(port_) + "/" + database_name_ + "?" + options_)
|
||||||
{
|
{
|
||||||
StorageInMemoryMetadata storage_metadata;
|
StorageInMemoryMetadata storage_metadata;
|
||||||
storage_metadata.setColumns(columns_);
|
storage_metadata.setColumns(columns_);
|
||||||
@ -56,7 +60,10 @@ void StorageMongoDB::connectIfNotConnected()
|
|||||||
{
|
{
|
||||||
std::lock_guard lock{connection_mutex};
|
std::lock_guard lock{connection_mutex};
|
||||||
if (!connection)
|
if (!connection)
|
||||||
connection = std::make_shared<Poco::MongoDB::Connection>(host, port);
|
{
|
||||||
|
StorageMongoDBSocketFactory factory;
|
||||||
|
connection = std::make_shared<Poco::MongoDB::Connection>(uri, factory);
|
||||||
|
}
|
||||||
|
|
||||||
if (!authenticated)
|
if (!authenticated)
|
||||||
{
|
{
|
||||||
@ -102,9 +109,9 @@ void registerStorageMongoDB(StorageFactory & factory)
|
|||||||
{
|
{
|
||||||
ASTs & engine_args = args.engine_args;
|
ASTs & engine_args = args.engine_args;
|
||||||
|
|
||||||
if (engine_args.size() != 5)
|
if (engine_args.size() < 5 || engine_args.size() > 6)
|
||||||
throw Exception(
|
throw Exception(
|
||||||
"Storage MongoDB requires 5 parameters: MongoDB('host:port', database, collection, 'user', 'password').",
|
"Storage MongoDB requires from 5 to 6 parameters: MongoDB('host:port', database, collection, 'user', 'password' [, 'options']).",
|
||||||
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
ErrorCodes::NUMBER_OF_ARGUMENTS_DOESNT_MATCH);
|
||||||
|
|
||||||
for (auto & engine_arg : engine_args)
|
for (auto & engine_arg : engine_args)
|
||||||
@ -118,6 +125,11 @@ void registerStorageMongoDB(StorageFactory & factory)
|
|||||||
const String & username = engine_args[3]->as<ASTLiteral &>().value.safeGet<String>();
|
const String & username = engine_args[3]->as<ASTLiteral &>().value.safeGet<String>();
|
||||||
const String & password = engine_args[4]->as<ASTLiteral &>().value.safeGet<String>();
|
const String & password = engine_args[4]->as<ASTLiteral &>().value.safeGet<String>();
|
||||||
|
|
||||||
|
String options = "";
|
||||||
|
|
||||||
|
if (engine_args.size() >= 6)
|
||||||
|
options = engine_args[5]->as<ASTLiteral &>().value.safeGet<String>();
|
||||||
|
|
||||||
return StorageMongoDB::create(
|
return StorageMongoDB::create(
|
||||||
args.table_id,
|
args.table_id,
|
||||||
parsed_host_port.first,
|
parsed_host_port.first,
|
||||||
@ -126,6 +138,7 @@ void registerStorageMongoDB(StorageFactory & factory)
|
|||||||
collection,
|
collection,
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
|
options,
|
||||||
args.columns,
|
args.columns,
|
||||||
args.constraints,
|
args.constraints,
|
||||||
args.comment);
|
args.comment);
|
||||||
|
@ -26,6 +26,7 @@ public:
|
|||||||
const std::string & collection_name_,
|
const std::string & collection_name_,
|
||||||
const std::string & username_,
|
const std::string & username_,
|
||||||
const std::string & password_,
|
const std::string & password_,
|
||||||
|
const std::string & options_,
|
||||||
const ColumnsDescription & columns_,
|
const ColumnsDescription & columns_,
|
||||||
const ConstraintsDescription & constraints_,
|
const ConstraintsDescription & constraints_,
|
||||||
const String & comment);
|
const String & comment);
|
||||||
@ -50,6 +51,8 @@ private:
|
|||||||
const std::string collection_name;
|
const std::string collection_name;
|
||||||
const std::string username;
|
const std::string username;
|
||||||
const std::string password;
|
const std::string password;
|
||||||
|
const std::string options;
|
||||||
|
const std::string uri;
|
||||||
|
|
||||||
std::shared_ptr<Poco::MongoDB::Connection> connection;
|
std::shared_ptr<Poco::MongoDB::Connection> connection;
|
||||||
bool authenticated = false;
|
bool authenticated = false;
|
||||||
|
36
src/Storages/StorageMongoDBSocketFactory.cpp
Normal file
36
src/Storages/StorageMongoDBSocketFactory.cpp
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
#include "StorageMongoDBSocketFactory.h"
|
||||||
|
|
||||||
|
#include <Poco/Net/IPAddress.h>
|
||||||
|
#include <Poco/Net/SocketAddress.h>
|
||||||
|
#include <Poco/Net/SecureStreamSocket.h>
|
||||||
|
|
||||||
|
|
||||||
|
#pragma clang diagnostic ignored "-Wunused-parameter"
|
||||||
|
#pragma GCC diagnostic ignored "-Wunused-parameter"
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
Poco::Net::StreamSocket StorageMongoDBSocketFactory::createSocket(const std::string & host, int port, Poco::Timespan connectTimeout, bool secure)
|
||||||
|
{
|
||||||
|
return secure ? createSecureSocket(host, port) : createPlainSocket(host, port);
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::StreamSocket StorageMongoDBSocketFactory::createPlainSocket(const std::string & host, int port)
|
||||||
|
{
|
||||||
|
Poco::Net::SocketAddress address(host, port);
|
||||||
|
Poco::Net::StreamSocket socket(address);
|
||||||
|
|
||||||
|
return socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
Poco::Net::StreamSocket StorageMongoDBSocketFactory::createSecureSocket(const std::string & host, int port)
|
||||||
|
{
|
||||||
|
Poco::Net::SocketAddress address(host, port);
|
||||||
|
Poco::Net::SecureStreamSocket socket(address, host);
|
||||||
|
|
||||||
|
return socket;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
19
src/Storages/StorageMongoDBSocketFactory.h
Normal file
19
src/Storages/StorageMongoDBSocketFactory.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <Poco/MongoDB/Connection.h>
|
||||||
|
|
||||||
|
|
||||||
|
namespace DB
|
||||||
|
{
|
||||||
|
|
||||||
|
class StorageMongoDBSocketFactory : public Poco::MongoDB::Connection::SocketFactory
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual Poco::Net::StreamSocket createSocket(const std::string & host, int port, Poco::Timespan connectTimeout, bool secure) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
Poco::Net::StreamSocket createPlainSocket(const std::string & host, int port);
|
||||||
|
Poco::Net::StreamSocket createSecureSocket(const std::string & host, int port);
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user