diff options
author | Olivier Bertrand <bertrandop@gmail.com> | 2019-07-30 22:45:04 +0200 |
---|---|---|
committer | Olivier Bertrand <bertrandop@gmail.com> | 2019-07-30 22:45:04 +0200 |
commit | e4797a991f7597892608e9327adfc1ca7841e62d (patch) | |
tree | 53d855c91c20c50889a24c275fb7151376cd0b70 /storage/connect/tabrest.cpp | |
parent | 4e583a276fa0efe67f0185604b062668db707af0 (diff) | |
download | mariadb-git-e4797a991f7597892608e9327adfc1ca7841e62d.tar.gz |
In CONNECT version 1.6.10 NOSQL facility is enhanced by a new way to retrieve NOSQL data.
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.
-- 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
-- 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
-- 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
-- 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
Diffstat (limited to 'storage/connect/tabrest.cpp')
-rw-r--r-- | storage/connect/tabrest.cpp | 133 |
1 files changed, 133 insertions, 0 deletions
diff --git a/storage/connect/tabrest.cpp b/storage/connect/tabrest.cpp new file mode 100644 index 00000000000..e800411a36d --- /dev/null +++ b/storage/connect/tabrest.cpp @@ -0,0 +1,133 @@ +/*************** Rest C++ Program Source Code File (.CPP) **************/ +/* PROGRAM NAME: Rest Version 1.3 */ +/* (C) Copyright to the author Olivier BERTRAND 2018 - 2019 */ +/* This program is the REST OEM (Web API support) module definition. */ +/***********************************************************************/ + +/***********************************************************************/ +/* Definitions needed by the included files. */ +/***********************************************************************/ +#include <my_global.h> // All MariaDB stuff + +/***********************************************************************/ +/* Include application header files: */ +/* global.h is header containing all global declarations. */ +/* plgdbsem.h is header containing the DB application declarations. */ +/* (x)table.h is header containing the TDBASE declarations. */ +/***********************************************************************/ +#include "global.h" +#include "plgdbsem.h" +#include "xtable.h" +#include "filamtxt.h" +#include "plgxml.h" +#include "tabdos.h" +#include "tabfmt.h" +#include "tabjson.h" +#include "tabrest.h" +#include "tabxml.h" + +/***********************************************************************/ +/* Get the file from the Web. */ +/***********************************************************************/ +int restGetFile(PGLOBAL g, PCSZ http, PCSZ uri, PCSZ fn); + +#if defined(__WIN__) +static PCSZ slash= "\\"; +#else // !__WIN__ +static PCSZ slash= "/"; +#define stricmp strcasecmp +#endif // !__WIN__ + +/***********************************************************************/ +/* Return the columns definition to MariaDB. */ +/***********************************************************************/ +PQRYRES RESTColumns(PGLOBAL g, PTOS tp, char *tab, char *db, bool info) +{ + PQRYRES qrp= NULL; + char filename[_MAX_PATH]; + PCSZ http, uri, fn, ftype; + + http= GetStringTableOption(g, tp, "Http", NULL); + uri= GetStringTableOption(g, tp, "Uri", NULL); + fn= GetStringTableOption(g, tp, "Filename", "rest.json"); + ftype = GetStringTableOption(g, tp, "Type", "JSON"); + + // We used the file name relative to recorded datapath + strcat(strcat(strcat(strcpy(filename, "."), slash), db), slash); + strncat(filename, fn, _MAX_PATH); + + // Retrieve the file from the web and copy it locally + if (http && restGetFile(g, http, uri, filename)) { + // sprintf(g->Message, "Failed to get file at %s", http); + } else if (!stricmp(ftype, "XML")) + qrp= XMLColumns(g, db, tab, tp, info); + else if (!stricmp(ftype, "JSON")) + qrp= JSONColumns(g, db, NULL, tp, info); + else if (!stricmp(ftype, "CSV")) + qrp= CSVColumns(g, NULL, tp, info); + else + sprintf(g->Message, "Usupported file type %s", ftype); + + return qrp; +} // end of RESTColumns + +/* -------------------------- Class RESTDEF -------------------------- */ + +/***********************************************************************/ +/* DefineAM: define specific AM block values. */ +/***********************************************************************/ +bool RESTDEF::DefineAM(PGLOBAL g, LPCSTR am, int poff) +{ + char filename[_MAX_PATH]; + TABTYPE type= GetTypeID(am); + + switch (type) { + case TAB_JSON: + case TAB_XML: + case TAB_CSV: + break; + default: + sprintf(g->Message, "Unsupported REST table type %s", am); + return true; + } // endswitch type + + Http= GetStringCatInfo(g, "Http", NULL); + Uri= GetStringCatInfo(g, "Uri", NULL); + Fn= GetStringCatInfo(g, "Filename", "rest.json"); + + // We used the file name relative to recorded datapath + PlugSetPath(filename, Fn, GetPath()); + + // Retrieve the file from the web and copy it locally + if (Http && restGetFile(g, Http, Uri, filename)) {} + else if (type == TAB_JSON) + Tdp= new (g) JSONDEF; + else if (type == TAB_XML) + Tdp= new (g) XMLDEF; + else if (type == TAB_CSV) + Tdp= new (g) CSVDEF; + else + sprintf(g->Message, "Unsupported REST table type %s", am); + + // Do make the table/view definition + if (Tdp && Tdp->Define(g, Cat, Name, Schema, "REST")) + Tdp= NULL; // Error occured + + // Return true in case of error + return (Tdp == NULL); +} // end of DefineAM + +/***********************************************************************/ +/* GetTable: makes a new Table Description Block. */ +/***********************************************************************/ +PTDB RESTDEF::GetTable(PGLOBAL g, MODE m) +{ + if (m != MODE_READ && m != MODE_READX) { + strcpy(g->Message, "REST tables are currently read only"); + return NULL; + } // endif m + + return Tdp->GetTable(g, m); // Leave file type do the job +} // end of GetTable + +/* ---------------------- End of Class RESTDEF ----------------------- */ |