mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 20:42:30 +01:00
dd30ba4c1b
In addition to files and Mongo collections, JSON as well as XML and CSV data can be retrieved from the net as answers from REST queries. Because it uses and external package (cpprestsdk) this is currently available only to MariaDB servers compiled from source. -- Add the REST support when Microsoft Casablanca package (cpprestsdk) is installed. -- Add compile flags needed on Windows /MD or /MDd (debug) -- Also include some changes specific to MariaDB 10.3. modified: storage/connect/CMakeLists.txt -- Add conditional REST support -- Added string options HTTP and URI. -- Added added internal table type TAB_REST. modified: storage/connect/ha_connect.cc modified: storage/connect/mycat.cc modified: storage/connect/mycat.h modified: storage/connect/plgdbsem.h -- Add conditional code based on the preprocessor definition MARIADB -- This to be able to use the same code in CONNECT and EOM modules modified: storage/connect/osutil.h modified: storage/connect/tabrest.cpp -- Add files for the REST OEM module added: storage/connect/mini-global.h added: storage/connect/rest.def -- Fix MDEV-19648 Variable connect_conv_size doesn't change -- Change Variable wrong block parameter from 8169 to 1. -- Also change connect_conv_size default value to 1024. modified: storage/connect/ha_connect.cc -- Fix compilation error when ZIP is not supported modified: storage/connect/ha_connect.cc modified: storage/connect/tabfmt.cpp -- Replace PlugSetPath by some concat (crashed on Fedora) + typo modified: storage/connect/reldef.cpp -- Avoid possible buffer overflow -- In particular by the function ShowValue. modified: storage/connect/tabdos.cpp modified: storage/connect/tabfmt.cpp modified: storage/connect/value.cpp modified: storage/connect/value.h -- Add some cast to avoid some compiler warnings modified: storage/connect/filamdbf.cpp -- Fix some C++ error modified: storage/connect/javaconn.cpp modified: storage/connect/jmgoconn.cpp modified: storage/connect/plugutil.cpp -- Add some tracing + typo modified: storage/connect/mycat.cc modified: storage/connect/tabjson.cpp -- Add the xtrc tracing function modified: storage/connect/global.h modified: storage/connect/plugutil.cpp -- Modify tracing to use xtrc and some typo modified: storage/connect/array.cpp modified: storage/connect/block.h -- Miscellaneous Typo and warning suppressing changes modified: storage/connect/connect.cpp modified: storage/connect/connect.h modified: storage/connect/filamvct.cpp modified: storage/connect/inihandl.cpp modified: storage/connect/jsonudf.cpp modified: storage/connect/libdoc.cpp modified: storage/connect/tabjson.cpp modified: storage/connect/tabtbl.cpp modified: storage/connect/tabxml.cpp modified: storage/connect/user_connect.cc modified: storage/connect/user_connect.h -- Update failing test results and disbling modified: storage/connect/mysql-test/connect/disabled.def modified: storage/connect/mysql-test/connect/r/dir.result modified: storage/connect/mysql-test/connect/r/grant.result modified: storage/connect/mysql-test/connect/r/jdbc.result modified: storage/connect/mysql-test/connect/r/jdbc_postgresql.result modified: storage/connect/mysql-test/connect/r/xml.result modified: storage/connect/mysql-test/connect/r/xml2.result modified: storage/connect/mysql-test/connect/r/xml2_mult.result modified: storage/connect/mysql-test/connect/r/xml_mult.result -- Add an option modified: storage/connect/mysql-test/connect/t/grant.test
94 lines
2.7 KiB
C++
94 lines
2.7 KiB
C++
/************* 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>
|
|
#if defined(MARIADB)
|
|
#include <my_global.h>
|
|
#else
|
|
#include "mini-global.h"
|
|
#define _OS_H_INCLUDED // Prevent os.h to be called
|
|
#endif
|
|
|
|
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
|
|
|
|
#include "global.h"
|
|
|
|
/***********************************************************************/
|
|
/* Make a local copy of the requested file. */
|
|
/***********************************************************************/
|
|
int restGetFile(PGLOBAL g, PCSZ http, PCSZ uri, PCSZ fn)
|
|
{
|
|
int rc = 0;
|
|
bool xt = trace(515);
|
|
auto fileStream = std::make_shared<ostream>();
|
|
|
|
if (!http || !fn) {
|
|
strcpy(g->Message, "Missing http or filename");
|
|
return 2;
|
|
} // endif
|
|
|
|
if (xt)
|
|
htrc("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)
|
|
htrc("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)
|
|
htrc("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)
|
|
htrc("Return size=%u\n", n);
|
|
|
|
return fileStream->close();
|
|
});
|
|
|
|
// Wait for all the outstanding I/O to complete and handle any exceptions
|
|
try {
|
|
requestTask.wait();
|
|
|
|
if (xt)
|
|
htrc("In Wait\n");
|
|
|
|
} catch (const std::exception &e) {
|
|
if (xt)
|
|
htrc("Error exception: %s\n", e.what());
|
|
sprintf(g->Message, "Error exception: %s", e.what());
|
|
rc= 1;
|
|
} // end try/catch
|
|
|
|
if (xt)
|
|
htrc("restget done: rc=%d\n", rc);
|
|
|
|
return rc;
|
|
} // end of restGetFile
|