Spec-Zone.ru › MariaDB

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 доступен.

Содержимое, воспроизведенное на этом сайте, является собственностью его соответствующих владельцев, и это содержимое не проверяется предварительно компанией 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-oem-table-example/

Spec-Zone.ru

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