CONNECT — Создание библиотеки GetRest
Для включения функции REST в бинарных дистрибутивах MariaDB, функция вызова пакета cpprestsdk не включается в CONNECT, что позволяет CONNECT нормально работать, когда пакет cpprestsdk не установлен. Поэтому она должна быть скомпилирована отдельно как библиотека (so или dll), которая будет загружаться CONNECT при необходимости.
Эта библиотека будет содержать только один файл, показанный здесь:
/************* Restget C++ Program Source Code File (.CPP) *************/
/* Adapted from the sample program of the Casablanca tutorial. */
/* Copyright Olivier Bertrand 2019. */
/***********************************************************************/
#include <cpprest/filestream.h>
#include <cpprest/http_client.h>
using namespace utility::conversions; // String conversions utilities
using namespace web; // Common features like URIs.
using namespace web::http; // Common HTTP functionality
using namespace web::http::client; // HTTP client features
using namespace concurrency::streams; // Asynchronous streams
typedef const char* PCSZ;
extern "C" int restGetFile(char* m, bool xt, PCSZ http, PCSZ uri, PCSZ fn);
/***********************************************************************/
/* Make a local copy of the requested file. */
/***********************************************************************/
int restGetFile(char *m, bool xt, PCSZ http, PCSZ uri, PCSZ fn)
{
int rc = 0;
auto fileStream = std::make_shared<ostream>();
if (!http || !fn) {
strcpy(m, "Missing http or filename");
return 2;
} // endif
if (xt)
fprintf(stderr, "restGetFile: fn=%s\n", fn);
// Open stream to output file.
pplx::task<void> requestTask = fstream::open_ostream(to_string_t(fn))
.then([=](ostream outFile) {
*fileStream= outFile;
if (xt)
fprintf(stderr, "Outfile isopen=%d\n", outFile.is_open());
// Create http_client to send the request.
http_client client(to_string_t(http));
if (uri) {
// Build request URI and start the request.
uri_builder builder(to_string_t(uri));
return client.request(methods::GET, builder.to_string());
} else
return client.request(methods::GET);
})
// Handle response headers arriving.
.then([=](http_response response) {
if (xt)
fprintf(stderr, "Received response status code:%u\n",
response.status_code());
// Write response body into the file.
return response.body().read_to_end(fileStream->streambuf());
})
// Close the file stream.
.then([=](size_t n) {
if (xt)
fprintf(stderr, "Return size=%zu\n", n);
return fileStream->close();
});
// Wait for all the outstanding I/O to complete and handle any exceptions
try {
if (xt)
fprintf(stderr, "Waiting\n");
requestTask.wait();
} catch (const std::exception &e) {
if (xt)
fprintf(stderr, "Error exception: %s\n", e.what());
sprintf(m, "Error exception: %s", e.what());
rc= 1;
} // end try/catch
if (xt)
fprintf(stderr, "restget done: rc=%d\n", rc);
return rc;
} // end of restGetFile
Этот файл находится в исходном коде CONNECT как restget.cpp. Если у вас нет доступа к исходному коду, используйте ваш любимый редактор, чтобы создать его, скопировав и вставив из вышеприведённого.
Затем, на Linux, скомпилируйте библиотеку GetRest.so:
g++ -o GetRest.so -O3 -Wall -std=c++11 -fPIC -shared restget.cpp -lcpprest
Примечание: Вы можете заменить -O3 на -g, чтобы создать отладочную версию.
Эта библиотека должна быть размещена там, где к ней можно получить доступ. Хорошим местом является директория, где находится libcpprest.so, например, /usr/lib64. Вы можете переместить или скопировать её туда.
В Windows, используя Visual Studio, создайте пустой проект win32 dll под названием GetRest и добавьте в него вышеупомянутый файл. Также добавьте файл определения модуля restget.def:
LIBRARY REST EXPORTS restGetFile @1
Важно: Этот файл должен быть указан на странице свойств ввода компоновщика.
После компиляции, релизные или отладочные версии можно скопировать в соответствующие директории cpprestsdk, bin или debug\bin.
Это всё. Это одноразовая работа. После выполнения она будет работать со всеми новыми версиями MariaDB, использующими CONNECT версии 1.07.
Примечание: переменная xt tracing имеет значение true, когда в настройке connect_xtrace включено значение “MONGO” (512).
Внимание: Если ваш сервер падает при использовании этой функции, это, вероятно, связано с тем, что библиотека GetRest связана с неправильной библиотекой cpprestsdk (это может касаться только Windows).
Релизная версия GetRest должна быть связана с релизной версией библиотеки cpprestsdk (cpprest_2_10.dll), но если вы создаёте отладочную версию GetRest, убедитесь, что она связана с отладочной версией библиотеки cpprestsdk (cpprest_2_10d.dll).
Это может быть автоматизировано, если вы используете Visual Studio для создания GetRest.dll.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-making-the-getrest-library/