24.2.4.2 플러그인 데이터 구조
플러그인 라이브러리 파일에는 그것에 저장되어있는 플러그인을 나타내는 디스크립터 정보가 포함되어 있습니다.
플러그인 라이브러리 서버 플러그인이 포함되어있는 경우, 플러그인 라이브러리는 다음의 기술자 정보가 포함되어 있어야합니다.
라이브러리 디스크립터 라이브러리가 사용되는 일반적인 서버 플러그인 API 버전 번호를 나타 라이브러리에있는 각 서버 플러그인의 일반 플러그인 디스크립터를 포함하고 있습니다. 이 기술자의 프레임 워크를 제공하려면
plugin.h
헤더 파일에서 두 개의 매크로를 호출합니다.mysql_declare_plugin(
name
)... one or more server plugin descriptors here ...
mysql_declare_plugin_end;매크로가 확장되어 API 버전의 선언이 자동으로 제공됩니다. 플러그인 디스크립터를 지정해야합니다.
라이브러리 디스크립터의 각 일반 서버 플러그인은
st_mysql_plugin
구조로 기술됩니다. 이 플러그인 디스크립터 구조는 모든 유형의 서버 플러그인에 공통되는 정보 (플러그인 타입을 나타내는 값 플러그인 이름, 작성자, 설명, 라이센스 유형 서버가 플러그인을로드 및 언로드 때 호출 초기화 함수 및 초기화 해제 함수 포인터 및 플러그인을 구현하는 상태 또는 시스템 변수에 대한 포인터)가 포함되어 있습니다.라이브러리 디스크립터의 각 일반 서버 플러그인 디스크립터는 유형별 플러그인 디스크립터 포인터도 포함되어 있습니다. 플러그인은 유형마다 고유의 API를 가질 수 있기 때문에 유형별 기술자의 구조는 플러그인 유형에 따라 다릅니다. 유형별 플러그인 디스크립터는 유형별 API 버전 번호 및 플러그인 타입을 구현하는 데 필요한 함수 포인터가 포함되어 있습니다. 예를 들어, 전체 파서 플러그인은 초기화 함수 및 초기화 해제 함수 및 주요 구문 분석 함수가 있습니다. 서버 플러그인을 사용하여 텍스트를 구문 분석 할 때이 함수를 호출합니다.
플러그인 라이브러리는 라이브러리의 각 플러그인의 일반 기술자 및 유형별 기술자가 참조하는 인터페이스 함수도 포함되어 있습니다.
플러그인 라이브러리 클라이언트 플러그인이 포함되어있는 경우 해당 플러그인의 기술자가 포함되어 있어야합니다. 그 기술자는 모든 클라이언트 플러그인에 공통되는 고정 된 일련의 멤버로 시작하고 그 뒤에 플러그인 유형별 멤버가 계속됩니다. 디스크립터 프레임 워크를 제공하려면 client_plugin.h
헤더 파일에서 두 개의 매크로를 호출합니다.
mysql_declare_client_plugin(plugin_type
) ...members common to all client plugins
... ...type-specific extra members
... mysql_end_client_plugin;
플러그인 라이브러리는 클라이언트 기술자가 참조하는 인터페이스 함수도 포함되어 있습니다.
mysql_declare_plugin()
매크로 및 mysql_declare_client_plugin()
매크로 호출 방법이 약간 다릅니다 이것은 플러그인 라이브러리의 내용이 관련되어 있습니다. 다음 지침은이 규칙을 요약하고 있습니다.
mysql_declare_plugin()
및mysql_declare_client_plugin()
는 같은 소스 파일에서 사용할 수 있습니다. 이것은 1 개의 플러그인 라이브러리 서버 플러그인과 클라이언트 플러그인을 모두 포함 할 수있는 것을 의미합니다. 그러나mysql_declare_plugin()
와mysql_declare_client_plugin()
는 각각 한 번만 사용할 수 없습니다.mysql_declare_plugin()
는 여러 서버 플러그인 선언이 가능하기 때문에 하나의 플러그인 라이브러리에 여러 서버 플러그인을 저장할 수 있습니다.mysql_declare_client_plugin()
는 하나의 클라이언트 플러그인 선언 만 할 수 있습니다. 여러 클라이언트 플러그인을 작성하려면 별도의 플러그인 라이브러리를 사용해야합니다.
플러그인 라이브러리에 존재 libmysqlclient
에 포함되지 않은 클라이언트 플러그인을 클라이언트 프로그램을 찾는 경우 클라이언트 프로그램은 플러그인 이름과 동일한 기본 이름을 가진 파일을 찾습니다. 예를 들어, 라이브러리의 접미사로 .so
를 사용하는 시스템에서 auth_xxx
라는 클라이언트 인증 플러그인 프로그램으로 사용할 필요가있는 경우, 프로그램은 auth_xxx.so
라는 파일을 찾습니다. (OS X에서는 프로그램은 먼저 auth_xxx.dylib
을 찾고 다음 auth_xxx.so
을 찾습니다.) 따라서 플러그인 라이브러리 클라이언트 플러그인이 포함되어있는 경우 라이브러리가 플러그인과 같은 기본 이름 여야가 있습니다.
서버 플러그인을 포함하고있는 라이브러리의 경우는 다릅니다. --plugin-load
옵션 및 INSTALL PLUGIN
문은 라이브러리 파일 이름을 명시 적으로 지정하기 위해 라이브러리 이름과 라이브러리에 저장되어있는 서버 플러그인의 이름에 명시적인 관계가 필요하지 않습니다.
24.2.4.2.1 서버 플러그인 라이브러리 및 플러그인 Descriptor
서버 플러그인을 포함하는 모든 플러그인 라이브러리는 파일 내의 각 서버 플러그인의 일반 플러그인 기술자가 포함되어있는 라이브러리 디스크립터가 포함되어 있어야합니다. 이 섹션에서는 서버 플러그인 라이브러리 및 일반 기술자를 작성하는 방법에 대해 설명합니다.
라이브러리 디스크립터는 2 개의 심볼을 정의해야합니다.
_mysql_plugin_interface_version_
는 전반적인 플러그인 프레임 워크의 버전 번호를 지정합니다. 이것은MYSQL_PLUGIN_INTERFACE_VERSION
기호를 사용하여 지정하고이 기호는plugin.h
파일에 정의합니다._mysql_plugin_declarations_
플러그인 선언의 배열을 정의하고 모든 멤버가 0으로 설정된 선언으로 끝납니다. 각 선언은st_mysql_plugin
구조체의 인스턴스입니다 (plugin.h
에서 정의됩니다). 라이브러리 서버 플러그인에 대해이 중 하나가 필요합니다.
서버가 라이브러리에서이 두 기호를 찾을 수없는 경우, 서버는이를 정당한 플러그인 라이브러리로 받아들이지 않고 거부하고 오류를 발생시킵니다. 그러면 라이브러리를 플러그인 라이브러리로 특별히 빌드하지 않는 한, 플러그인 라이브러리를 사용할 수 없습니다.
필수 2 개의 심볼을 정의하는 일반적인 방법은 plugin.h
파일에서 mysql_declare_plugin()
매크로 및 mysql_declare_plugin_end
매크로를 사용하는 것입니다.
mysql_declare_plugin(name
)... one or more server plugin descriptors here ...
mysql_declare_plugin_end;
각 서버 플러그인은 서버 플러그인 API에 정보를 제공하는 일반 기술자가 필요합니다. 일반 기술자의 구조는 모든 플러그인 타입으로 동일합니다. plugin.h
파일의 st_mysql_plugin
구조에 의해이 기술자가 정의됩니다.
struct st_mysql_plugin { int type; /* the plugin type (a MYSQL_XXX_PLUGIN value) */ void *info; /* pointer to type-specific plugin descriptor */ const char *name; /* plugin name */ const char *author; /* plugin author (for I_S.PLUGINS) */ const char *descr; /* general descriptive text (for I_S.PLUGINS) */ int license; /* the plugin license (PLUGIN_LICENSE_XXX) */ int (*init)(void *); /* the function to invoke when plugin is loaded */ int (*deinit)(void *);/* the function to invoke when plugin is unloaded */ unsigned int version; /* plugin version (for I_S.PLUGINS) */ struct st_mysql_show_var *status_vars; struct st_mysql_sys_var **system_vars; void * __reserved1; /* reserved for dependency checking */ unsigned long flags; /* flags for plugin */ };
st_mysql_plugin
디스크립터 구조체의 멤버는 다음과 같이 사용합니다. char *
멤버는 NULL로 끝나는 문자열로 지정하십시오.
type
: 플러그인 형태. 이것은plugin.h
플러그인 타입 값 중 하나 여야합니다./* The allowable types of plugins */ #define MYSQL_UDF_PLUGIN 0 /* User-defined function */ #define MYSQL_STORAGE_ENGINE_PLUGIN 1 /* Storage Engine */ #define MYSQL_FTPARSER_PLUGIN 2 /* Full-text parser plugin */ #define MYSQL_DAEMON_PLUGIN 3 /* The daemon/raw plugin type */ #define MYSQL_INFORMATION_SCHEMA_PLUGIN 4 /* The I_S plugin type */ #define MYSQL_AUDIT_PLUGIN 5 /* The Audit plugin type */ #define MYSQL_REPLICATION_PLUGIN 6 /* The replication plugin type */ #define MYSQL_AUTHENTICATION_PLUGIN 7 /* The authentication plugin type */ ...
예를 들어, 전체 파서 플러그인의 경우,
type
값은MYSQL_FTPARSER_PLUGIN
입니다.info
: 플러그인 유형별 기술자의 포인터. 이 기술자의 구조는 일반 플러그인 디스크립터 구조와는 달리, 플러그인의 특정 유형에 따라 다릅니다. 버전을 제어하기 위해 모든 플러그인 타입의 유형별 디스크립터의 첫 번째 멤버는 유형의 인터페이스 버전 인 것으로 예상되고 있습니다. 그러면 서버는 유형에 관계없이 모든 플러그인의 유형별 버전을 확인할 수 있습니다. 기술자는 버전 번호 다음에 필요한 다른 멤버 (서버 플러그인을 제대로 호출하는 데 필요한 콜백 함수 및 기타 정보 등)가 포함되어 있습니다. 특정 유형의 서버 플러그인 기술에 관한 다음 섹션에서는 그 유형별 기술자의 구조를 설명하고 있습니다.name
: 플러그인 이름을 지정하는 문자열. 이것은mysql.plugin
테이블에 표시되는 이름이며,이 이름을 사용하여 SQL 문 (INSTALL PLUGIN
,UNINSTALL PLUGIN
등)에서 플러그인을 참조하거나--plugin-load
옵션으로 지정하여 플러그 인을 참조하기도합니다. 이 이름은INFORMATION_SCHEMA.PLUGINS
테이블 및SHOW PLUGINS
의 출력에 표시됩니다.플러그인 이름은 서버 옵션 이름에서 시작하지 않도록하십시오. 그렇게하면 서버는 플러그인 초기화에 실패합니다. 예를 들어, 서버는
--socket
옵션이 있기 때문에socket
,socket_plugin
등의 플러그인 이름을 사용하지 마십시오.author
: 플러그인 작성자를 나타내는 캐릭터 라인. 여기에는 임의의 문자열을 지정할 수 있습니다.desc
: 플러그인의 개요를 설명하는 문자열. 여기에는 임의의 문자열을 지정할 수 있습니다.license
: 플러그인 라이센스 유형. 값은PLUGIN_LICENSE_PROPRIETARY
,PLUGIN_LICENSE_GPL
또는PLUGIN_LICENSE_BSD
중 하나를 지정할 수 있습니다.init
: 한 번만 실행되는 초기화 함수이며, 그런 함수가 없으면NULL
입니다. 서버 플러그인을로드 할 때이 함수를 실행하고 이것은INSTALL PLUGIN
에서 실행되거나mysql.plugin
테이블에 나열되어있는 플러그인의 경우 서버 시작시 실행됩니다. 이 함수는 플러그인을 식별하는 데 사용되는 내부 구조체를 가리키는 하나의 인수를받습니다. 성공했을 경우는 제로 및 실패한 경우 0이 아닌 리턴합니다.deinit
: 한 번만 실행되는 초기화 해제 함수이며, 그런 함수가 없으면NULL
입니다. 서버 플러그인을 언로드 할 때이 함수를 실행하고 이것은UNINSTALL PLUGIN
에서 실행되거나mysql.plugin
테이블에 나열되어있는 플러그인의 경우 서버가 종료 될 때 실행됩니다. 이 함수는 플러그인을 식별하는 데 사용되는 내부 구조체를 가리키는 하나의 인수를받습니다. 성공했을 경우는 제로 및 실패한 경우 0이 아닌 리턴합니다.version
: 플러그인의 버전 번호. 플러그인이 설치되어있는 경우이 값을INFORMATION_SCHEMA.PLUGINS
테이블에서 얻을 수 있습니다. 이 값은 메이저 번호와 마이너 번호가 포함되어 있습니다. 16 진수 정수로 값을 작성하는 경우 형식은0x
이며 여기서MMNN
MM
및NN
은 각각 메이저 번호와 마이너 번호입니다. 예를 들어,0x0302
은 버전 3.2을 나타냅니다.status_vars
: 플러그인에 관련된 상태 변수의 구조체에 대한 포인터이며, 그런 변수가 없으면NULL
입니다. 플러그인을 설치하면이 변수는SHOW STATUS
명령문의 출력으로 표시됩니다.status_vars
멤버는NULL
이 아닌 경우 상태 변수를 설명st_mysql_show_var
구조체의 배열을 가리 킵니다. 섹션 24.2.4.2.2 "서버 플러그인의 상태 변수 및 시스템 변수" 를 참조하십시오.system_vars
: 플러그인에 관련된 시스템 변수 구조에 대한 포인터이며, 그런 변수가 없으면NULL
입니다. 이러한 옵션 및 시스템 변수는 플러그인의 변수를 초기화하는 데 사용할 수 있습니다.system_vars
멤버는NULL
이 아닌 경우 시스템 변수를 설명st_mysql_sys_var
구조체의 배열을 가리 킵니다. 섹션 24.2.4.2.2 "서버 플러그인의 상태 변수 및 시스템 변수" 를 참조하십시오.__reserved1
: 향후 이용하기위한 표시 자입니다. 현재NULL
을 설정하십시오.flags
: 플러그인 플래그. 개별 비트는 각종 플래그에 대응하고 있습니다. 이 값에 해당하는 플래그의 논리합을 설정하십시오. 다음 플래그를 사용할 수 있습니다.#define PLUGIN_OPT_NO_INSTALL 1UL /* Not dynamically loadable */ #define PLUGIN_OPT_NO_UNINSTALL 2UL /* Not dynamically unloadable */
PLUGIN_OPT_NO_INSTALL
은INSTALL PLUGIN
명령문을 사용하여 플러그인을 실행시로드 할 수 없음을 나타냅니다. 이것은--plugin-load
옵션을 사용하여 서버 시작시로드 할 필요가있는 플러그인의 경우에 적합합니다.PLUGIN_OPT_NO_UNINSTALL
은UNINSTALL PLUGIN
문을 사용하여 플러그인을 실행시에 언로드 할 수 없음을 나타냅니다.이 멤버는 MySQL 5.6.3에서 추가되었습니다.
서버는 플러그인을로드 및 언로드 할 경우에만 일반 플러그인 디스크립터의 init
함수 및 deinit
함수를 호출합니다. 이들은 SQL 문에 의해 플러그인이 시작 된 경우 등의 플러그인 사용시에는 관계가 없습니다.
예를 들어, simple_parser
라는 단일 전문 파서 플러그 인을 포함한 라이브러리 디스크립터 정보는 다음과 같이됩니다.
mysql_declare_plugin(ftexample) { MYSQL_FTPARSER_PLUGIN, /* type */ &simple_parser_descriptor, /* descriptor */ "simple_parser", /* name */ "Oracle Corporation", /* author */ "Simple Full-Text Parser", /* description */ PLUGIN_LICENSE_GPL, /* plugin license */ simple_parser_plugin_init, /* init function (when loaded) */ simple_parser_plugin_deinit,/* deinit function (when unloaded) */ 0x0001, /* version */ simple_status, /* status variables */ simple_system_variables, /* system variables */ NULL, 0 } mysql_declare_plugin_end;
전체 파서 플러그인의 경우 유형은 MYSQL_FTPARSER_PLUGIN
이어야합니다. 이것은 FULLTEXT
인덱스를 만들 때 WITH PARSER
절에서 사용하는 경우 플러그인이 합법적임을 식별하는 값입니다. (다른 플러그인 타입이 어구에 대해서도 유효하지 않습니다.)
plugin.h
는 mysql_declare_plugin()
매크로 및 mysql_declare_plugin_end
매크로를 다음과 같이 정의합니다.
#ifndef MYSQL_DYNAMIC_PLUGIN #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ MYSQL_PLUGIN_EXPORT int VERSION= MYSQL_PLUGIN_INTERFACE_VERSION; \ MYSQL_PLUGIN_EXPORT int PSIZE= sizeof(struct st_mysql_plugin); \ MYSQL_PLUGIN_EXPORT struct st_mysql_plugin DECLS[]= { #else #define __MYSQL_DECLARE_PLUGIN(NAME, VERSION, PSIZE, DECLS) \ MYSQL_PLUGIN_EXPORT int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; \ MYSQL_PLUGIN_EXPORT int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); \ MYSQL_PLUGIN_EXPORT struct st_mysql_plugin _mysql_plugin_declarations_[]= { #endif #define mysql_declare_plugin(NAME) \ __MYSQL_DECLARE_PLUGIN(NAME, \ builtin_ ## NAME ## _plugin_interface_version, \ builtin_ ## NAME ## _sizeof_struct_st_plugin, \ builtin_ ## NAME ## _plugin) #define mysql_declare_plugin_end ,{0,0,0,0,0,0,0,0,0,0,0,0,0}}
이러한 선언은 MYSQL_DYNAMIC_PLUGIN
심볼을 정의한 경우에만 _mysql_plugin_interface_version_
심볼을 정의합니다. 이것은 플러그인을 공유 라이브러리로 빌드하기위한 컴파일 명령의 일부로 -DMYSQL_DYNAMIC_PLUGIN
을 지정할 필요가 있다는 것을 의미합니다.
위와 같이 매크로가 사용 된 경우에는 다음 코드가 전개되고 필요한 기호 ( _mysql_plugin_interface_version_
및 _mysql_plugin_declarations_
)이 정의됩니다.
int _mysql_plugin_interface_version_= MYSQL_PLUGIN_INTERFACE_VERSION; int _mysql_sizeof_struct_st_plugin_= sizeof(struct st_mysql_plugin); struct st_mysql_plugin _mysql_plugin_declarations_[]= { { MYSQL_FTPARSER_PLUGIN, /* type */ &simple_parser_descriptor, /* descriptor */ "simple_parser", /* name */ "Oracle Corporation", /* author */ "Simple Full-Text Parser", /* description */ PLUGIN_LICENSE_GPL, /* plugin license */ simple_parser_plugin_init, /* init function (when loaded) */ simple_parser_plugin_deinit,/* deinit function (when unloaded) */ 0x0001, /* version */ simple_status, /* status variables */ simple_system_variables, /* system variables */ NULL, 0 } ,{0,0,0,0,0,0,0,0,0,0,0,0}} };
앞의 예에서는 일반 기술자에 단일 플러그 인을 선언했지만 여러 플러그인을 선언 할 수 있습니다. mysql_declare_plugin()
와 mysql_declare_plugin_end
사이에 선언을 쉼표로 구분하여 순서대로 나열합니다.
MySQL 서버 플러그인은 C 또는 C ++ (또는 C 호출 규칙을 사용할 수있는 다른 언어)로 작성할 수 있습니다. C ++ 플러그인을 작성하는 경우에 사용해서는 안 C ++ 기능은 전역 구조체를 초기화하기위한 상수가 아닌 변수입니다. st_mysql_plugin
구조 등의 구조체의 멤버는 상수 변수 만 초기화하십시오. 앞에서 언급 한 simple_parser
기술자는이 요구 사항을 충족하기 위해 C ++ 플러그인으로 허용됩니다.
mysql_declare_plugin(ftexample) { MYSQL_FTPARSER_PLUGIN, /* type */ &simple_parser_descriptor, /* descriptor */ "simple_parser", /* name */ "Oracle Corporation", /* author */ "Simple Full-Text Parser", /* description */ PLUGIN_LICENSE_GPL, /* plugin license */ simple_parser_plugin_init, /* init function (when loaded) */ simple_parser_plugin_deinit,/* deinit function (when unloaded) */ 0x0001, /* version */ simple_status, /* status variables */ simple_system_variables, /* system variables */ NULL, 0 } mysql_declare_plugin_end;
일반 기술자를 설명하는 다른 효과적인 방법을 보여줍니다. 여기에서는 플러그인 이름, 작성자 및 설명을 지정하는 상수 변수가 사용되고 있습니다.
const char *simple_parser_name = "simple_parser"; const char *simple_parser_author = "Oracle Corporation"; const char *simple_parser_description = "Simple Full-Text Parser"; mysql_declare_plugin(ftexample) { MYSQL_FTPARSER_PLUGIN, /* type */ &simple_parser_descriptor, /* descriptor */ simple_parser_name, /* name */ simple_parser_author, /* author */ simple_parser_description, /* description */ PLUGIN_LICENSE_GPL, /* plugin license */ simple_parser_plugin_init, /* init function (when loaded) */ simple_parser_plugin_deinit,/* deinit function (when unloaded) */ 0x0001, /* version */ simple_status, /* status variables */ simple_system_variables, /* system variables */ NULL, 0 } mysql_declare_plugin_end;
그러나 다음의 일반 기술자는 무효입니다. 여기에 플러그인 이름, 작성자 및 설명을 지정하기 위해 구조체 멤버가 사용되고 있습니다 만, C ++ 구조 상수 이니셜 라이저로 간주되지 않습니다.
typedef struct { const char *name; const char *author; const char *description; } plugin_info; plugin_info parser_info = { "simple_parser", "Oracle Corporation", "Simple Full-Text Parser" }; mysql_declare_plugin(ftexample) { MYSQL_FTPARSER_PLUGIN, /* type */ &simple_parser_descriptor, /* descriptor */ parser_info.name, /* name */ parser_info.author, /* author */ parser_info.description, /* description */ PLUGIN_LICENSE_GPL, /* plugin license */ simple_parser_plugin_init, /* init function (when loaded) */ simple_parser_plugin_deinit,/* deinit function (when unloaded) */ 0x0001, /* version */ simple_status, /* status variables */ simple_system_variables, /* system variables */ NULL, 0 } mysql_declare_plugin_end;
24.2.4.2.2 서버 플러그인의 상태 변수 및 시스템 변수
서버 플러그인 인터페이스를 사용하면 플러그인이 일반 플러그인 디스크립터의 status_vars
회원 및 system_vars
멤버를 사용하여 상태 변수 및 시스템 변수를 노출 할 수 있습니다.
일반 플러그인 디스크립터의 status_vars
멤버는 0이 아닌 경우 st_mysql_show_var
구조체의 배열을 의미하며 각 구조는 하나의 상태 변수가 설명되어 있고, 모든 구성원이 0으로 설정된 구조가 뒤에 계속됩니다. st_mysql_show_var
구조체의 정의는 다음과 같습니다.
struct st_mysql_show_var { const char *name; char *value; enum enum_mysql_show_type type; };
플러그인이 설치되면 플러그인 이름과 name
값이 밑줄로 결합되어 SHOW STATUS
에 표시되는 이름이 형성됩니다.
다음 표는 허용되는 상태 변수의 type
값 및 해당 변수를 보여줍니다.
표 24.1 서버 플러그인의 상태 변수의 유형
변수 유형 | 의미 |
---|---|
SHOW_BOOL | boolean변수에 대한 포인터 |
SHOW_INT | integer 변수에 대한 포인터 |
SHOW_LONG | long integer 변수에 대한 포인터 |
SHOW_LONGLONG | longlong integer 변수에 대한 포인터 |
SHOW_CHAR | string |
SHOW_CHAR_PTR | string에 대한 포인터 |
SHOW_ARRAY | 다른 st_mysql_show_var 배열에 대한 포인터 |
SHOW_FUNC | 함수 포인터 |
SHOW_DOUBLE | double 포인터 |
SHOW_FUNC
유형의 경우 함수가 호출되면 함수는 out
매개 변수에 값을 설정하고 표시되는 변수에 대한 정보를이 매개 변수에 의해 제공됩니다. 함수의 시그니처는 다음과 같이됩니다.
#define SHOW_VAR_FUNC_BUFF_SIZE 1024 typedef int (*mysql_show_var_func) (void *thd, struct st_mysql_show_var *out, char *buf);
system_vars
멤버는 0이 아닌 경우 st_mysql_sys_var
구조체의 배열을 의미하며 각 구조는 하나의 시스템 변수가 설명되어 있고 (이것은 명령 행 또는 구성 파일에서 설정할 수 있습니다) 모든 멤버가 0으로 설정 된 구조가 후에 계속됩니다. st_mysql_sys_var
구조는 다음과 같이 정의합니다.
struct st_mysql_sys_var { int flags; const char *name, *comment; int (*check)(THD*, struct st_mysql_sys_var *, void*, st_mysql_value*); void (*update)(THD*, struct st_mysql_sys_var *, void*, const void*); };
플래그에 의해 추가 필드가 필요에 따라 부가됩니다.
편의를 위해 플러그인의 새 시스템 변수의 생성을보다 쉽게하기위한 다수의 매크로가 정의되어 있습니다.
매크로는 다음 필드를 사용할 수 있습니다.
name
: 시스템 변수 인용되지 않은 식별자입니다.varname
: 정적 변수의 식별자. 식별자가없는 경우는name
필드와 동일합니다.opt
: 시스템 변수에 추가로 사용되는 플래그. 다음 표는 허용되는 플래그를 보여줍니다.표 24.2 서버 플러그인 시스템 변수 플래그
플래그 값 설명 PLUGIN_VAR_READONLY
시스템 변수는 읽기 전용이다 PLUGIN_VAR_NOSYSVAR
시스템 변수는 실행시 사용자에게 표시되지 않습니다 PLUGIN_VAR_NOCMDOPT
시스템 변수는 명령 행에서 구성 할 수 없습니다 PLUGIN_VAR_NOCMDARG
명령 행 인수는 불필요하다 (일반적으로 boolean 변수로 사용합니다) PLUGIN_VAR_RQCMDARG
명령 행 인수가 필요하다 (이것은 기본값입니다) PLUGIN_VAR_OPCMDARG
명령 행 인수는 옵션이다 PLUGIN_VAR_MEMALLOC
문자열 변수에 사용되는 문자열의 저장 메모리가 할당 된 것을 나타내는 comment
: 서버 도움말 메시지에 표시되는 설명 코멘트. 이 변수가 숨겨져있는 경우는NULL
입니다.check
: 체크 함수. 기본값은NULL
입니다.update
: 업데이트 기능. 기본값은NULL
입니다.default
: 변수의 기본값.minimum
: 변수의 최소.maximum
: 변수의 최대 값.blocksize
: 변수의 블록 크기. 값이 설정되면, 가장 가까운blocksize
의 배수로 반올림됩니다.
시스템 변수는 정적 변수를 사용하여 직접 방문하거나 SYSVAR()
액세스 기능 매크로를 사용하여 액세스 할 수 있습니다. 완전성을 기하기 위하여 SYSVAR()
매크로가 제공되고 있습니다. 일반적으로 코드 기반이되는 변수에 직접 액세스 할 수없는 경우에만 사용하십시오.
예 :
static int my_foo; static MYSQL_SYSVAR_INT(foo_var, my_foo, PLUGIN_VAR_RQCMDARG, "foo comment", NULL, NULL, 0, 0, INT_MAX, 0); ... SYSVAR(foo_var)= value; value= SYSVAR(foo_var); my_foo= value; value= my_foo;
세션 변수는 THDVAR()
액세스 기능 매크로를 통해서만 액세스 할 수 있습니다. 예 :
static MYSQL_THDVAR_BOOL(some_flag, PLUGIN_VAR_NOCMDARG, "flag comment", NULL, NULL, FALSE); ... if (THDVAR(thd, some_flag)) { do_something(); THDVAR(thd, some_flag)= FALSE; }
모든 글로벌 시스템 변수 및 세션 시스템 변수는 사용하기 전에 mysqld에 공개해야합니다. 이것은 NULL
로 끝나는 변수의 배열을 만들고 플러그인 퍼블릭 인터페이스에서 그것에 연결하여 할 수 있습니다. 예 :
static struct st_mysql_sys_var *my_plugin_vars[]= { MYSQL_SYSVAR(foo_var), MYSQL_SYSVAR(some_flag), NULL }; mysql_declare_plugin(fooplug) { MYSQL_..._PLUGIN, &plugin_data, "fooplug", "foo author", "This does foo!", PLUGIN_LICENSE_GPL, foo_init, foo_fini, 0x0001, NULL, my_plugin_vars, NULL, 0 } mysql_declare_plugin_end;
다음의 지원 매크로를 사용하면 다양한 종류의 시스템 변수를 선언 할 수 있습니다.
1 바이트의 boolean 값 (0 = FALSE 1 = TRUE) 인
my_bool
형 boolean 시스템 변수.MYSQL_THDVAR_BOOL(name, opt, comment, check, update, default) MYSQL_SYSVAR_BOOL(name, varname, opt, comment, check, update, default)
NULL로 끝나는 문자열에 대한 포인터이다
char*
형태의 문자열 시스템 변수.MYSQL_THDVAR_STR(name, opt, comment, check, update, default) MYSQL_SYSVAR_STR(name, varname, opt, comment, check, update, default)
각종 정수 시스템 변수.
일반적으로 4 바이트 부호있는 단어 인
int
시스템 변수.MYSQL_THDVAR_INT(name, opt, comment, check, update, default, min, max, blk) MYSQL_SYSVAR_INT(name, varname, opt, comment, check, update, default, minimum, maximum, blocksize)
일반적으로 4 바이트의 부호없는 워드 인
unsigned int
시스템 변수.MYSQL_THDVAR_UINT(name, opt, comment, check, update, default, min, max, blk) MYSQL_SYSVAR_UINT(name, varname, opt, comment, check, update, default, minimum, maximum, blocksize)
일반적으로 4 바이트 또는 8 바이트의 부호있는 단어 인
long
시스템 변수.MYSQL_THDVAR_LONG(name, opt, comment, check, update, default, min, max, blk) MYSQL_SYSVAR_LONG(name, varname, opt, comment, check, update, default, minimum, maximum, blocksize)
일반적으로 4 바이트 또는 8 바이트의 부호없는 워드 인
unsigned long
시스템 변수.MYSQL_THDVAR_ULONG(name, opt, comment, check, update, default, min, max, blk) MYSQL_SYSVAR_ULONG(name, varname, opt, comment, check, update, default, minimum, maximum, blocksize)
일반적으로 8 바이트의 부호있는 단어 인
long long
시스템 변수.MYSQL_THDVAR_LONGLONG(name, opt, comment, check, update, default, minimum, maximum, blocksize) MYSQL_SYSVAR_LONGLONG(name, varname, opt, comment, check, update, default, minimum, maximum, blocksize)
일반적으로 8 바이트의 부호없는 워드 인
unsigned long long
시스템 변수.MYSQL_THDVAR_ULONGLONG(name, opt, comment, check, update, default, minimum, maximum, blocksize) MYSQL_SYSVAR_ULONGLONG(name, varname, opt, comment, check, update, default, minimum, maximum, blocksize)
일반적으로 4 바이트 또는 8 바이트의 부호없는 워드 인
unsigned long
시스템 변수. 설정 가능한 값의 범위는typelib
의 요소 수의 서수이며 0부터 시작합니다.MYSQL_THDVAR_ENUM(name, opt, comment, check, update, default, typelib) MYSQL_SYSVAR_ENUM(name, varname, opt, comment, check, update, default, typelib)
일반적으로 8 바이트의 부호없는 워드 인
unsigned long long
시스템 변수. 각 비트는typelib
의 요소를 나타냅니다.MYSQL_THDVAR_SET(name, opt, comment, check, update, default, typelib) MYSQL_SYSVAR_SET(name, varname, opt, comment, check, update, default, typelib)
내부적으로 변경 될 수있는 모든 플러그인 시스템 변수는 HASH
구조에 저장됩니다.
서버의 명령 줄에서 도움말 텍스트 표시는 명령 행 옵션에 관련된 모든 변수 DYNAMIC_ARRAY
을 컴파일 순서대로 정렬하고 그것을 반복 옵션을 표시함으로써 처리됩니다.
명령 행 옵션이 처리되면 handle_option()
함수 ( my_getopt.c
)에 의해 argv
로부터 제거되고 실질적으로 그 역할이 끝납니다.
서버 플러그인의 설치 과정 (플러그인이로드 된 직후하며 플러그인 초기화 함수를 호출하기 전에)에 명령 행 옵션을 처리합니다.
런타임에로드되는 플러그인은 구성 옵션을 사용할 수 없기 때문에 사용 가능한 기본값이 있어야합니다. 플러그인을 설치하면 mysqld의 초기화시에로드 된 구성 옵션을 명령 행 또는 my.cnf
에서 설정할 수 있습니다.
플러그인 thd
매개 변수를 읽기 전용으로하는 것을 고려하십시오.
24.2.4.2.3 클라이언트 플러그인 기술자
각 클라이언트 플러그인은 클라이언트 플러그인 API에 정보를 제공하는 기술자가 필요합니다.기술자의 구조는 모든 클라이언트 플러그인에 공통되는 고정 된 일련의 멤버로 시작 플러그인 유형별 멤버가 후에 계속됩니다.
client_plugin.h
파일의 st_mysql_client_plugin
구조는 일반 멤버가 포함되어있는 " 일반적인 " 디스크립터를 정의합니다.
struct st_mysql_client_plugin { int type; unsigned int interface_version; const char *name; const char *author; const char *desc; unsigned int version[3]; const char *license; void *mysql_api; int (*init)(char *, size_t, int, va_list); int (*deinit)(); int (*options)(const char *option, const void *); };
st_mysql_client_plugin
디스크립터 구조의 일반 회원은 다음과 같이 사용합니다. char *
멤버는 NULL로 끝나는 문자열로 지정하십시오.
type
: 플러그인 형태.이것은client_plugin.h
플러그인 타입 값 (MYSQL_CLIENT_AUTHENTICATION_PLUGIN
등) 중 하나 여야합니다.interface_version
: 플러그인 인터페이스 버전. 예를 들어, 인증 플러그인의 경우, 이것은MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION
입니다.name
: 플러그인 이름을 지정하는 문자열. 이것은MYSQL_DEFAULT_AUTH
옵션을 지정하여mysql_options ()
를 호출하거나 MySQL 클라이언트 프로그램에--default-auth
옵션을 지정할 때 플러그인을 참조하는 이름입니다.author
: 플러그인 작성자를 나타내는 캐릭터 라인. 여기에는 임의의 문자열을 지정할 수 있습니다.desc
: 플러그인의 개요를 설명하는 문자열. 여기에는 임의의 문자열을 지정할 수 있습니다.version
: 메이저, 마이너, 및 그 아래 버전을 나타내는 3 개의 정수의 배열 인 플러그인 버전. 예를 들어,{1,2,3}
는 버전 1.2.3을 나타냅니다.license
: 라이센스 유형을 지정하는 문자열.mysql_api
: 내부적으로 사용됩니다. 플러그인 기술자가NULL
로 지정합니다.init
: 한 번만 실행되는 초기화 함수이며, 그런 함수가 없으면NULL
입니다. 클라이언트 라이브러리는 플러그인을로드 할 때이 함수를 실행합니다. 함수는 성공시 0, 그리고 실패하면 0이 아닌 반환합니다.오류가 발생했을 경우,
init
함수는 첫번째 2 개의 인수를 사용하여 오류 메시지를 반환합니다. 첫 번째 인수는char
버퍼에 대한 포인터이고 두 번째 인자는 버퍼 길이를 나타냅니다.init
함수에 의해 반환되는 모든 메시지는 NULL로 끝나야하므로 최대 메시지 길이는 버퍼 길이에서 1을 뺀 길이입니다. 다음 아규먼트가mysql_load_plugin ()
에 전달됩니다. 첫 번째 인수는 이후에 존재하는 인수의 수를 나타 (없으면 0) 그 후에 나머지 인수가 계속됩니다.deinit
: 한 번만 실행되는 초기화 해제 함수이며, 그런 함수가 없으면NULL
입니다. 클라이언트 라이브러리는 플러그인을 언로드 할 때이 함수를 실행합니다. 이 함수는 인수를받지 않습니다. 성공했을 경우는 제로 및 실패한 경우 0이 아닌 리턴합니다.options
: 플러그인에 전달되는 옵션을 처리하기위한 함수이며, 그런 함수가 없으면NULL
입니다. 이 함수는 옵션 이름과 그 값에 대한 포인터를 나타내는 두 개의 인수를받습니다. 함수는 성공시 0, 그리고 실패하면 0이 아닌 반환합니다.
특정 클라이언트 플러그인 타입은 일반적인 기술자 멤버의 뒤에 해당 유형의 플러그인을 구현하는 데 필요한 추가 멤버가 따를 수 있습니다. 예를 들어, 인증 플러그인 st_mysql_client_plugin_AUTHENTICATION
구조는 인증을 수행하기 위해 클라이언트 라이브러리가 호출하는 함수가 마지막에 있습니다.
플러그인을 선언하려면 mysql_declare_client_plugin ()
매크로 및 mysql_end_client_plugin
매크로를 사용합니다
mysql_declare_client_plugin(plugin_type
) ...members common to all client plugins
... ...type-specific extra members
... mysql_end_client_plugin;
type
또는 interface_version
멤버를 명시 적으로 지정하지 마십시오. mysql_declare_client_plugin ()
매크로는 plugin_type
인수를 사용하여 이러한 값을 자동으로 생성합니다. 예를 들어, 인증 클라이언트 플러그인은 다음과 같이 선언합니다.
mysql_declare_client_plugin(AUTHENTICATION) "my_auth_plugin", "Author Name", "My Client Authentication Plugin", {1,0,0}, "GPL", NULL, my_auth_init, my_auth_deinit, my_auth_options, my_auth_main mysql_end_client_plugin;
이 선언은 AUTHENTICATION
인수를 사용하여 type
및 interface_version
회원 MYSQL_CLIENT_AUTHENTICATION_PLUGIN
및 MYSQL_CLIENT_AUTHENTICATION_PLUGIN_INTERFACE_VERSION
을 설정하고 있습니다.
플러그인 유형에 따라 기술자의 공통 멤버에 이어 다른 멤버가있을 수 있습니다. 예를 들어, 인증 플러그인의 경우, 서버와의 통신을 처리하는 함수 (위의 기술자가 my_auth_main ()
)가 있습니다. 섹션 24.2.4.9 "인증 플러그인 만들기" 를 참조하십시오.
일반적으로 인증 플러그인의 사용을 지원하는 클라이언트 프로그램은 mysql_options ()
를 호출 MYSQL_DEFAULT_AUTH
옵션 및 MYSQL_PLUGIN_DIR
옵션을 설정하여 플러그인을로드합니다.
char *plugin_dir = "path_to_plugin_dir
"; char *default_auth = "plugin_name
"; /* ... process command-line options ... */ mysql_options(&mysql, MYSQL_PLUGIN_DIR, plugin_dir); mysql_options(&mysql, MYSQL_DEFAULT_AUTH, default_auth);
일반적으로 프로그램은 사용자가 기본값을 대체 할 수있는 --plugin-dir
및 --default-auth
옵션도 사용할 수 있습니다.
클라이언트 프로그램에서 낮은 수준의 플러그인 관리가 필요한 경우 클라이언트 라이브러리에 st_mysql_client_plugin
인수를 함수를 포함합니다. 섹션 23.8.14 "C API 클라이언트 플러그인 함수" 를 참조하십시오.