CONNECT — Добавление REST-функциональности как библиотеки, вызываемой таблицей OEM
Если вы используете версию MariaDB, не поддерживающую REST, вот как можно добавить REST-функциональность в виде библиотеки, вызываемой таблицей OEM.
Перед созданием REST-модуля OEM необходимо установить пакет Microsoft Casablanca, как и при компиляции MariaDB из исходных кодов.
Даже если этот модуль будет использоваться с бинарным дистрибутивом, вам потребуются некоторые исходные файлы CONNECT для успешной сборки. Он создается с четырьмя файлами, присутствующими в версии 1.06.0010 CONNECT: tabrest.cpp, restget.cpp, tabrest.h и mini-global.h. Он также нуждается в заголовочных файлах CONNECT, которые включены в tabrest.cpp, и тех, которые они могут включать. Это можно получить, перейдя на веб-сайт последней загрузки версии MariaDB, включающей REST-функциональность, загрузив файл исходных кодов MariaDB в формате tar.gz и извлекая из него файлы исходных кодов CONNECT в директорию, которая будет добавлена в дополнительные каталоги исходных кодов, если это не каталог, содержащий указанные файлы.
В Windows используйте последнюю версию Visual Studio. Создайте новый пустой проект DLL и добавьте исходные файлы tabrest.cpp и restget.cpp. Visual Studio автоматически сгенерирует все необходимые подключения к SDK cpprest. Просто измените свойства проекта, чтобы добавить дополнительный каталог включения (каталог, куда был загружен исходный код CONNECT) и ссылку на ha_connect.lib бинарной версии MariaDB (в том же каталоге, что и ha_connect.dll в вашем бинарном дистрибутиве). Добавьте определение препроцессора XML_SUPPORT. Также в разделе «Ввод» страницы свойств проекта установите «Файл определения модуля» на файл rest.def (с полным путем), также присутствующий в исходных файлах CONNECT. Если вы создаёте конфигурацию отладки, убедитесь, что в разделе «Генерация кода C/C++» строка «Библиотека времени выполнения» указывает «Многопоточная библиотека DLL отладки (/MDd)», иначе ваш сервер может аварийно завершить работу при использовании этой функции.
Это не совсем просто, но это ничто по сравнению с Linux! Кто-то, создавший модуль OEM для собственного приложения, написал:
По какой-то причине g++ / ld в Linux чрезвычайно требовательны к тому, что они будут и не будут рассматривать как «библиотеку» для целей линковки. Для того, чтобы они распознали и, следовательно, нашли `ha_connect.so` как «действительную» связуемую библиотеку, `ha_connect.so` должна находиться в каталоге, путь к которому есть в `/etc/ld.so.conf` или `/etc/ld.so.conf.d/ha_connect.conf`, *И* его имя файла должно начинаться с «lib».
В Fedora вы можете создать ссылку на ha_connect.so следующим образом:
$ sudo ln -s /..path to../ha_connect.so /usr/lib64/libconnect.so
Это создаёт библиотеку, имя которой начинается с «lib». Она создана в /usr/lib64/, потому что это каталог библиотеки libcpprest.so Casablanca. Это решило необходимость файла в /etc/ld.so.conf.d, так как это уже сделано для библиотеки cpprest. Обратите внимание, что параметр -s обязателен, без него возникают различные ошибки при использовании функции.
Затем скомпилируйте и установите модуль OEM с помощью:
$ makdir oem $ cd oem $ makedir Release $ make -f oemrest.mak $ sudo cp rest.so /usr/local/mysql/lib/plugin
Файл oemrest.mak:
#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)
Переменные SD и CD — это каталоги исходных файлов CONNECT и каталог, содержащий libcpprest.so библиотеку. Их можно изменить, чтобы они соответствовали каталогам на вашем компьютере. OD — это каталог, созданный для хранения объектных файлов.
Очень важный флаг — -fno-rtti. Без него у вас возникнут серьёзные проблемы.
Полученный модуль, например rest.so или rest.dll, должен быть помещён в каталог плагинов сервера MariaDB. Затем вы сможете использовать таблицы NoSQL, просто заменив в инструкции CREATE TABLE параметр TABLE_TYPE = JSON или XML на TABLE_TYPE=OEM SUBTYPE=REST MODULE=’rest.(so|dll)’. На самом деле имя модуля, здесь предположительно ‘rest’, может быть любым.
Тип файла по умолчанию — JSON. Если нет, он должен быть указан так:
OPTION_LIST=’Ftype=XML’
Для добавления в инструкцию создания таблицы. Например:
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';
Примечание: этот последний пример возвращает XML-файл, формат которого не распознавался старыми версиями CONNECT. Именно поэтому существует опция ‘Rownode=weatherdata’.
Если у вас возникнут проблемы со сборкой модуля, вы можете создать проблему на JIRA.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-adding-the-rest-feature-as-a-library-called-by-an-oem-table/