CONNECT - Adding the REST Feature as a Library Called by an OEM Table
If you are using a version of MariaDB that does not support REST, this is how the REST feature can be added as a library called by an OEM table.
Before making the REST OEM module, the Microsoft Casablanca package must be installed as for compiling MariaDB from source.
Even if this module is to be used with a binary distribution, you need some CONNECT source files in order to successfully make it. It is made with four files existing in the version 1.06.0010 of CONNECT: tabrest.cpp, restget.cpp, tabrest.h and mini-global.h. It also needs the CONNECT header files that are included in tabrest.cpp and the ones they can include. This can be obtained by going to a recent download site of a version of MariaDB that includes the REST feature, downloading the MariaDB source file tar.gz and extracting from it the CONNECT sources files in a directory that will be added to the additional source directories if it is not the directory containing the above files.
On Windows, use a recent version of Visual Studio. Make a new empty DLL project and add the source files tabrest.cpp and restget.cpp. Visual studio should automatically generate all necessary connections to the cpprest SDK. Just edit the properties of the project to add the additional include directory (the one where the CONNECT source was downloaded) et the link to the ha_connect.lib of the binary version of MariaDB (in the same directory than ha_connect.dll in your binary distribution). Add the preprocessor definition XML_SUPPORT. Also set in the linker input page of the project property the Module definition File to the rest.def file (with its full path) also existing in the CONNECT source files. If you are making a debug configuration, make sure that in the C/C++ Code generation page the Runtime library line specifies Multi-threaded Debug DLL (/MDd) or your server will crash when using the feature.
This is not really simple but it is nothing compared with Linux! Someone having made an OEM module for its own application have written:
For whatever reason, g++ / ld on Linux are both extremely picky about what they will and won't consider a *"library"* for linking purposes. In order to get them to recognize and therefore find `ha_connect.so` as a "valid" linkable library, `ha_connect.so` must exist in a directory whose path is in `/etc/ld.so.conf` or `/etc/ld.so.conf.d/ha_connect.conf` *AND* its filename must begin with "lib".
On Fedora, you can make a link to ha_connect.so by:
$ sudo ln -s /..path to../ha_connect.so /usr/lib64/libconnect.so
This provides a library whose name begins with “lib”. It was made in /usr/lib64/ because it was the directory of the libcpprest.so Casablanca library. This solved the need of a file in /etc/ld.so.conf.d as this was already done for the cpprest library. Note that the -s parameter is a must, without it all sort of nasty errors are met when using the feature.
Then compile and install the OEM module with:
$ makdir oem $ cd oem $ makedir Release $ make -f oemrest.mak $ sudo cp rest.so /usr/local/mysql/lib/plugin
The oemrest.mak file:
#LINUX CPP = g++ LD = g++ OD = ./Release/ SD = /home/olivier/MariaDB/server/storage/connect/ CD =/usr/lib64 # flags to compile object files that can be used in a dynamic library CFLAGS= -Wall -c -O3 -std=c++11 -fPIC -fno-rtti -I$(SD) -DXML_SUPPORT # Replace -03 by -g for debug LDFLAGS = -L$(CD) -lcpprest -lconnect # Flags to create a dynamic library. DYNLINKFLAGS = -shared # on some platforms, use '-G' instead. # REST library's archive file OEMREST = rest.so SRCS_CPP = $(SD)tabrest.cpp $(SD)restget.cpp OBJS_CPP = $(OD)tabrest.o $(OD)restget.o # top-level rule all: $(OEMREST) $(OEMREST): $(OBJS_CPP) $(LD) $(OBJS_CPP) $(LDFLAGS) $(DYNLINKFLAGS) -o $@ #CPP Source files $(OD)tabrest.o: $(SD)tabrest.cpp $(SD)mini-global.h $(SD)global.h $(SD)plgdbsem.h $(SD)xtable.h $(SD)filamtxt.h $(SD)plgxml.h $(SD)tabdos.h $(SD)tabfmt.h $(SD)tabjson.h $(SD)tabrest.h $(SD)tabxml.h $(CPP) $(CFLAGS) -o $@ $(SD)$(*F).cpp $(OD)restget.o: $(SD)restget.cpp $(SD)mini-global.h $(SD)global.h $(CPP) $(CFLAGS) -o $@ $(SD)$(*F).cpp # clean everything clean: $(RM) $(OBJS_CPP) $(OEMREST)
The SD and CD variables are the directories of the CONNECT source files and the one containing the libcpprest.so lib. They can be edited to match those on your machine OD is the directory that was made to contain the object files.
A very important flag is -fno-rtti. Without it you would be in big trouble.
The resulting module, for instance rest.so or rest.dll, must be placed in the plugin directory of the MariaDB server. Then, you will be able to use NoSQL tables simply replacing in the CREATE TABLE statement the TABLE_TYPE option =JSON or XML by TABLE_TYPE=OEM SUBTYPE=REST MODULE=’rest.(so|dll)’. Actually, the module name, here supposedly ‘rest’, can be anything you like.
The file type is JSON by default. If not, it must be specified like this:
OPTION_LIST=’Ftype=XML’
To be added to the create table statement. For instance:
CREATE TABLE webw ENGINE=CONNECT TABLE_TYPE=OEM MODULE='Rest.dll' SUBTYPE=REST FILE_NAME='weatherdata.xml' HTTP='https://samples.openweathermap.org/data/2.5/forecast?q=London,us&mode=xml&appid=b6907d289e10d714a6e88b30761fae22' OPTION_LIST='Ftype=XML,Depth=3,Rownode=weatherdata';
Note: this last example returns an XML file whose format was not recognized by old CONNECT versions. It is here the reason of the option ‘Rownode=weatherdata’.
If you have trouble making the module, you can post an issue on JIRA.