CONNECT - Пример таблицы OEM
Это пример, демонстрирующий, как реализовать таблицу OEM.
Заголовок файла my_global.h:
/***********************************************************************/
/* Definitions needed by the included files. */
/***********************************************************************/
#if !defined(MY_GLOBAL_H)
#define MY_GLOBAL_H
typedef unsigned int uint;
typedef unsigned int uint32;
typedef unsigned short ushort;
typedef unsigned long ulong;
typedef unsigned long DWORD;
typedef char *LPSTR;
typedef const char *LPCSTR;
typedef int BOOL;
#if defined(__WIN__)
typedef void *HANDLE;
#else
typedef int HANDLE;
#endif
typedef char *PSZ;
typedef const char *PCSZ;
typedef unsigned char BYTE;
typedef unsigned char uchar;
typedef long long longlong;
typedef unsigned long long ulonglong;
typedef char my_bool;
struct charset_info_st {};
typedef const charset_info_st CHARSET_INFO;
#define FALSE 0
#define TRUE 1
#define Item char
#define MY_MAX(a,b) ((a>b)?(a):(b))
#define MY_MIN(a,b) ((a<b)?(a):(b))
#endif // MY_GLOBAL_H
Примечание: Это фиктивный my_global.h, содержащий только полезную информацию для файла jmgoem.cpp.
Файл исходного кода jmgoem.cpp:
/************* jmgoem C++ Program Source Code File (.CPP) **************/
/* PROGRAM NAME: jmgoem Version 1.0 */
/* (C) Copyright to the author Olivier BERTRAND 2017 */
/* This program is the Java MONGO OEM module definition. */
/***********************************************************************/
/***********************************************************************/
/* Definitions needed by the included files. */
/***********************************************************************/
#include "my_global.h"
/***********************************************************************/
/* 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. */
/* tabext.h is header containing the TDBEXT declarations. */
/* mongo.h is header containing the MONGO declarations. */
/***********************************************************************/
#include "global.h"
#include "plgdbsem.h"
#if defined(HAVE_JMGO)
#include "csort.h"
#include "javaconn.h"
#endif // HAVE_JMGO
#include "xtable.h"
#include "tabext.h"
#include "mongo.h"
/***********************************************************************/
/* These functions are exported from the MONGO library. */
/***********************************************************************/
extern "C" {
PTABDEF __stdcall GetMONGO(PGLOBAL, void*);
PQRYRES __stdcall ColMONGO(PGLOBAL, PTOS, void*, char*, char*, bool);
} // extern "C"
/***********************************************************************/
/* DB static variables. */
/***********************************************************************/
int TDB::Tnum;
int DTVAL::Shift;
#if defined(HAVE_JMGO)
int CSORT::Limit = 0;
double CSORT::Lg2 = log(2.0);
size_t CSORT::Cpn[1000] = {0}; /* Precalculated cmpnum values */
#if defined(HAVE_JAVACONN)
char *JvmPath = NULL;
char *ClassPath = NULL;
char *GetPluginDir(void)
{return "C:/mongo-java-driver/mongo-java-driver-3.4.2.jar;"
"C:/MariaDB-10.1/MariaDB/storage/connect/";}
char *GetJavaWrapper(void) {return (char*)"wrappers/Mongo3Interface";}
#else // !HAVE_JAVACONN
HANDLE JAVAConn::LibJvm; // Handle to the jvm DLL
CRTJVM JAVAConn::CreateJavaVM;
GETJVM JAVAConn::GetCreatedJavaVMs;
#if defined(_DEBUG)
GETDEF JAVAConn::GetDefaultJavaVMInitArgs;
#endif // _DEBUG
#endif // !HAVE_JAVACONN
#endif // HAVE_JMGO
/***********************************************************************/
/* This function returns a Mongo definition class. */
/***********************************************************************/
PTABDEF __stdcall GetMONGO(PGLOBAL g, void *memp)
{
return new(g, memp) MGODEF;
} // end of GetMONGO
#ifdef NOEXP
/***********************************************************************/
/* Functions to be defined if not exported by the CONNECT version. */
/***********************************************************************/
bool IsNum(PSZ s)
{
for (char *p = s; *p; p++)
if (*p == ']')
break;
else if (!isdigit(*p) || *p == '-')
return false;
return true;
} // end of IsNum
#endif
/***********************************************************************/
/* Return the columns definition to MariaDB. */
/***********************************************************************/
PQRYRES __stdcall ColMONGO(PGLOBAL g, PTOS tp, char *tab,
char *db, bool info)
{
#ifdef NOMGOCOL
// Cannot use discovery
strcpy(g->Message, "No discovery, MGOColumns is not accessible");
return NULL;
#else
return MGOColumns(g, db, NULL, tp, info);
#endif
} // end of ColMONGO
Файл mongo.def: (требуется только в Windows)
LIBRARY MONGO EXPORTS GetMONGO @1 ColMONGO @2
Компиляция этого OEM-модуля
Чтобы скомпилировать этот OEM-модуль, сначала создайте два или три необходимых файла, скопировав их из перечисленных выше.
Даже если этот модуль будет использоваться с бинарным распространением, для успешной компиляции вам потребуются некоторые исходные файлы. По меньшей мере, заголовки CONNECT, включенные в jmgoem.cpp, и те, что они могут включать. Это можно получить, скачав файл исходного кода MariaDB в формате tar.gz и извлекая из него файлы CONNECT в директорию, которая будет добавлена в дополнительные директории исходных кодов, если это не директория, содержащая вышеперечисленные файлы.
Модуль должен быть связан с ha_connect.lib бинарной версии, с которой он будет использоваться. В последних дистрибутивах эта библиотека добавлена в директорию плагинов.
Полученный модуль, например mongo.so или mongo.dll, должен быть размещен в директории плагинов сервера MariaDB. Затем вы сможете использовать таблицы типа MONGO, просто заменив в операторе CREATE TABLE опцию TABLE_TYPE=MONGO на TABLE_TYPE=OEM SUBTYPE=MONGO MODULE=’mongo.(so|dll)’. На самом деле, имя модуля, предположительно «mongo», может быть любым.
Это будет работать с последними (еще не выпущенными) версиями MariaDB 10.0 и 10.1, потому что, даже если оно не включено, тип MONGO включен в них. Это также относится к MariaDB 10.2.9, но затем в Windows нужно будет определить NOEXP и NOMGOCOL, потому что эти функции не экспортируются этой версией.
Для реализации в более старых версиях, не содержащих тип MONGO, вы можете добавить соответствующие исходные файлы, а именно javaconn.cpp, jmgfam.cpp, jmgoconn.cpp, mongo.cpp и tabjmg.cpp, которые вы должны найти в извлеченных файлах исходного кода CONNECT, если вы скачали последнюю версию. Поскольку они включают my_global.h, именно поэтому включенный файл получил такое имя. Кроме того, ваша компиляция должна определить HAVE_JMGO и HAVE_JAVACONN. Конечно, это возможно только если ha_connect.lib доступен.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/connect-oem-table-example/