Spec-Zone.ru › MariaDB

CONNECT - Компиляция JSON UDF в отдельной библиотеке

Хотя JSON UDF можно удобно включить в модуль библиотеки CONNECT, в некоторых случаях может потребоваться разместить их в отдельной библиотеке.

Это необходимо, когда CONNECT компилируется встраиваемо или если требуется протестировать или использовать эти UDF с другими версиями MariaDB, не содержащими их.

Для этого необходимо получить доступ к последнему исходному коду MariaDB. Затем создайте проект, содержащий следующие файлы:

  1. jsonudf.cpp
  2. json.cpp
  3. value.cpp
  4. osutil.c
  5. plugutil.cpp
  6. maputil.cpp
  7. 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.
  • Отсутствует отслеживание.
Содержимое, воспроизведённое на этом сайте, является собственностью соответствующих владельцев, и это содержимое не проверяется предварительно компанией MariaDB. Мнения, информация и мнения, выраженные в этом содержимом, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API