CONNECT - Компиляция JSON UDF в отдельной библиотеке
Хотя JSON UDF можно удобно включить в модуль библиотеки CONNECT, в некоторых случаях может потребоваться разместить их в отдельной библиотеке.
Это необходимо, когда CONNECT компилируется встраиваемо или если требуется протестировать или использовать эти UDF с другими версиями MariaDB, не содержащими их.
Для этого необходимо получить доступ к последнему исходному коду MariaDB. Затем создайте проект, содержащий следующие файлы:
- jsonudf.cpp
- json.cpp
- value.cpp
- osutil.c
- plugutil.cpp
- maputil.cpp
- jsonutil.cpp
jsonutil.cpp не распространяется вместе с исходным кодом, его необходимо создать следующим образом:
#include "my_global.h"
#include "mysqld.h"
#include "plugin.h"
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#include "global.h"
extern "C" int GetTraceValue(void) { return 0; }
uint GetJsonGrpSize(void) { return 100; }
/***********************************************************************/
/* These replace missing function of the (not used) DTVAL class. */
/***********************************************************************/
typedef struct _datpar *PDTP;
PDTP MakeDateFormat(PGLOBAL, PSZ, bool, bool, int) { return NULL; }
int ExtractDate(char*, PDTP, int, int val[6]) { return 0; }
#ifdef __WIN__
my_bool CloseFileHandle(HANDLE h)
{
return !CloseHandle(h);
} /* end of CloseFileHandle */
#else /* UNIX */
my_bool CloseFileHandle(HANDLE h)
{
return (close(h)) ? TRUE : FALSE;
} /* end of CloseFileHandle */
int GetLastError()
{
return errno;
} /* end of GetLastError */
#endif // UNIX
/***********************************************************************/
/* Program for sub-allocating one item in a storage area. */
/* Note: This function is equivalent to PlugSubAlloc except that in */
/* case of insufficient memory, it returns NULL instead of doing a */
/* long jump. The caller must test the return value for error. */
/***********************************************************************/
void *PlgDBSubAlloc(PGLOBAL g, void *memp, size_t size)
{
PPOOLHEADER pph; // Points on area header.
if (!memp) // Allocation is to be done in the Sarea
memp = g->Sarea;
size = ((size + 7) / 8) * 8; /* Round up size to multiple of 8 */
pph = (PPOOLHEADER)memp;
if ((uint)size > pph->FreeBlk) { /* Not enough memory left in pool */
sprintf(g->Message,
"Not enough memory in Work area for request of %d (used=%d free=%d)",
(int)size, pph->To_Free, pph->FreeBlk);
return NULL;
} // endif size
// Do the suballocation the simplest way
memp = MakePtr(memp, pph->To_Free); // Points to sub_allocated block
pph->To_Free += size; // New offset of pool free block
pph->FreeBlk -= size; // New size of pool free block
return (memp);
} // end of PlgDBSubAlloc
Вы можете создать файл, скопировав и вставив из вышеприведённого примера.
Установите все дополнительные каталоги включения в каталоги включения MariaDB, используемые при компиляции плагина, плюс ссылку на каталоги storage/connect, и скомпилируйте, как любой другой UDF, присвоив любое имя созданному модулю библиотеки (я использовал jsonudf.dll в Windows).
Затем вы можете создать функции, используя это имя в качестве параметра soname.
При использовании UDF таким образом существуют некоторые ограничения:
- Переменная connect_json_grp_size недоступна. Размер группы устанавливается и извлекается с помощью функций jsonset_grp_size и jsonget_grp_size (ранее 100).
- В случае ошибки предупреждения заменяются сообщениями, отправленными в stderr.
- Отсутствует отслеживание.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-compiling-json-udfs-in-a-separate-library/