More methods

This commit is contained in:
kssenii 2021-03-05 10:43:47 +00:00
parent dd4a7b6e3d
commit e0cda1033a
6 changed files with 116 additions and 23 deletions

View File

@ -79,12 +79,22 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe
LOG_TRACE(log, "Library path: '{}', library_settings: '{}'", library_path, library_settings);
library_handler->libNew(library_path, library_settings);
writeStringBinary("Ok.", out);
writeStringBinary("1", out);
}
else if (method == "libDelete")
{
//library_handler->libDelete();
writeStringBinary("Ok.", out);
writeStringBinary("1", out);
}
else if (method == "isModified")
{
auto res = library_handler->isModified();
writeStringBinary(std::to_string(res), out);
}
else if (method == "supportsSelectiveLoad")
{
auto res = library_handler->supportsSelectiveLoad();
writeStringBinary(std::to_string(res), out);
}
else if (method == "loadAll")
{
@ -112,6 +122,42 @@ void LibraryRequestHandler::handleRequest(HTTPServerRequest & request, HTTPServe
auto input = library_handler->loadAll(attributes, *sample_block);
BlockOutputStreamPtr output = FormatFactory::instance().getOutputStream("RowBinary", out, *sample_block, context);
copyData(*input, *output);
}
else if (method == "loadIds")
{
if (!params.has("attributes"))
{
processError(response, "No 'attributes' in request URL");
return;
}
if (!params.has("ids"))
{
processError(response, "No 'ids' in request URL");
return;
}
std::string attributes = params.get("attributes");
std::string ids = params.get("ids");
std::string columns = params.get("columns");
std::shared_ptr<Block> sample_block;
try
{
sample_block = parseColumns(std::move(columns));
}
catch (const Exception & ex)
{
processError(response, "Invalid 'columns' parameter in request body '" + ex.message() + "'");
LOG_WARNING(log, ex.getStackTraceString());
return;
}
auto input = library_handler->loadIds(attributes, ids, *sample_block);
BlockOutputStreamPtr output = FormatFactory::instance().getOutputStream("RowBinary", out, *sample_block, context);
copyData(*input, *output);
}
}

View File

@ -39,13 +39,32 @@ void SharedLibraryHandler::libNew(const std::string & path, const std::string &
settings_holder = std::make_shared<CStringsHolder>(CStringsHolder(lib_settings));
auto lib_new = library->tryGet<decltype(lib_data) (*)(
decltype(&settings_holder->strings), decltype(&ClickHouseLibrary::log))>("ClickHouseDictionary_v3_libNew");
decltype(&settings_holder->strings), decltype(&ClickHouseLibrary::log))>("ClickHouseDictionary_v3_libNew");
if (lib_new)
lib_data = lib_new(&settings_holder->strings, ClickHouseLibrary::log);
}
bool SharedLibraryHandler::isModified()
{
if (auto func_is_modified = library->tryGet<bool (*)(
decltype(lib_data), decltype(&settings_holder->strings))>("ClickHouseDictionary_v3_isModified"))
return func_is_modified(lib_data, &settings_holder->strings);
return true;
}
bool SharedLibraryHandler::supportsSelectiveLoad()
{
if (auto func_supports_selective_load = library->tryGet<bool (*)(
decltype(lib_data), decltype(&settings_holder->strings))>("ClickHouseDictionary_v3_supportsSelectiveLoad"))
return func_supports_selective_load(lib_data, &settings_holder->strings);
return true;
}
//void SharedLibraryHandler::libCloneOrNew()
//{
// if (auto lib_clone = library->tryGet<decltype(lib_data) (*)(decltype(other.lib_data))>("ClickHouseDictionary_v3_libClone"))

View File

@ -28,6 +28,10 @@ public:
BlockInputStreamPtr loadIds(const std::string & ids_string, const std::string & attributes_string, const Block & sample_block);
bool isModified();
bool supportsSelectiveLoad();
private:
Block dataToBlock(const Block & sample_block, const void * data);

View File

@ -66,15 +66,13 @@ bool LibraryBridgeHelper::initLibrary(const std::string & library_path, const st
startLibraryBridgeSync();
auto uri = getDictionaryURI();
uri.addQueryParameter("method", LIBNEW_METHOD);
uri.addQueryParameter("method", LIB_NEW_METHOD);
uri.addQueryParameter("library_path", library_path);
uri.addQueryParameter("library_settings", library_settings);
ReadWriteBufferFromHTTP buf(uri, Poco::Net::HTTPRequest::HTTP_POST, {}, ConnectionTimeouts::getHTTPTimeouts(context));
bool res;
readBoolText(res, buf);
return res;
}
@ -84,13 +82,39 @@ bool LibraryBridgeHelper::deleteLibrary()
startLibraryBridgeSync();
auto uri = getDictionaryURI();
uri.addQueryParameter("method", LIBDELETE_METHOD);
uri.addQueryParameter("method", LIB_DELETE_METHOD);
ReadWriteBufferFromHTTP buf(uri, Poco::Net::HTTPRequest::HTTP_POST, {}, ConnectionTimeouts::getHTTPTimeouts(context));
bool res;
readBoolText(res, buf);
return res;
}
bool LibraryBridgeHelper::isModified()
{
startLibraryBridgeSync();
auto uri = getDictionaryURI();
uri.addQueryParameter("method", IS_MODIFIED_METHOD);
ReadWriteBufferFromHTTP buf(uri, Poco::Net::HTTPRequest::HTTP_POST, {}, ConnectionTimeouts::getHTTPTimeouts(context));
bool res;
readBoolText(res, buf);
return res;
}
bool LibraryBridgeHelper::supportsSelectiveLoad()
{
startLibraryBridgeSync();
auto uri = getDictionaryURI();
uri.addQueryParameter("method", SUPPORTS_SELECTIVE_LOAD_METHOD);
ReadWriteBufferFromHTTP buf(uri, Poco::Net::HTTPRequest::HTTP_POST, {}, ConnectionTimeouts::getHTTPTimeouts(context));
bool res;
readBoolText(res, buf);
return res;
}
@ -101,7 +125,7 @@ BlockInputStreamPtr LibraryBridgeHelper::loadAll(const std::string attributes_st
auto uri = getDictionaryURI();
uri.addQueryParameter("method", LOADALL_METHOD);
uri.addQueryParameter("method", LOAD_ALL_METHOD);
uri.addQueryParameter("attributes", attributes_string);
uri.addQueryParameter("columns", sample_block.getNamesAndTypesList().toString());
@ -123,7 +147,7 @@ BlockInputStreamPtr LibraryBridgeHelper::loadIds(const std::string attributes_st
auto uri = getDictionaryURI();
uri.addQueryParameter("method", LOADALL_METHOD);
uri.addQueryParameter("method", LOAD_IDS_METHOD);
uri.addQueryParameter("attributes", attributes_string);
uri.addQueryParameter("ids", ids_string);
uri.addQueryParameter("columns", sample_block.getNamesAndTypesList().toString());
@ -145,7 +169,7 @@ bool LibraryBridgeHelper::isLibraryBridgeRunning() const
try
{
ReadWriteBufferFromHTTP buf(getPingURI(), Poco::Net::HTTPRequest::HTTP_GET, {}, ConnectionTimeouts::getHTTPTimeouts(context));
return checkString(LibraryBridgeHelper::PING_OK_ANSWER, buf);
return checkString(PING_OK_ANSWER, buf);
}
catch (...)
{

View File

@ -33,15 +33,21 @@ public:
BlockInputStreamPtr loadIds(const std::string attributes_string, const std::string ids_string, const Block & sample_block);
bool isModified();
bool supportsSelectiveLoad();
static constexpr inline size_t DEFAULT_PORT = 9018;
static constexpr inline auto DEFAULT_HOST = "127.0.0.1";
static constexpr inline auto PING_HANDLER = "/ping";
static constexpr inline auto MAIN_HANDLER = "/";
static constexpr inline auto LIBNEW_METHOD = "libNew";
static constexpr inline auto LIBDELETE_METHOD = "libDelete";
static constexpr inline auto LOADALL_METHOD = "loadAll";
static constexpr inline auto LIB_NEW_METHOD = "libNew";
static constexpr inline auto LIB_DELETE_METHOD = "libDelete";
static constexpr inline auto LOAD_ALL_METHOD = "loadAll";
static constexpr inline auto LOAD_IDS_METHOD = "loadIds";
static constexpr inline auto IS_MODIFIED_METHOD = "isModified";
static constexpr inline auto SUPPORTS_SELECTIVE_LOAD_METHOD = "supportsSelectiveLoad";
static constexpr inline auto DEFAULT_FORMAT = "RowBinary";
static constexpr inline auto PING_OK_ANSWER = "Ok.";

View File

@ -189,19 +189,13 @@ BlockInputStreamPtr LibraryDictionarySource::loadKeys(const Columns &/* key_colu
bool LibraryDictionarySource::isModified() const
{
//if (auto func_is_modified = library->tryGet<bool (*)(decltype(lib_data), decltype(&settings->strings))>("ClickHouseDictionary_v3_isModified"))
// return func_is_modified(lib_data, &settings->strings);
return true;
return bridge_helper->isModified();
}
bool LibraryDictionarySource::supportsSelectiveLoad() const
{
//if (auto func_supports_selective_load = library->tryGet<bool (*)(decltype(lib_data), decltype(&settings->strings))>("ClickHouseDictionary_v3_supportsSelectiveLoad"))
// return func_supports_selective_load(lib_data, &settings->strings);
return true;
return bridge_helper->supportsSelectiveLoad();
}