24.3 플러그인을 위한 MySQL 서비스
MySQL 서버 플러그인은 서버의 "서비스"에 액세스 할 수 있습니다. 서비스 인터페이스는 플러그인이 호출 할 수있는 서버 기능을 제공합니다. 이것은 플러그인 API를 보완하여 다음과 같은 특징이 있습니다.
서비스로 플러그인은 일반 함수 호출을 사용하여 서버 내부의 코드에 액세스 할 수 있습니다.
서비스는 이식성이 여러 플랫폼에서 작동합니다.
인터페이스는 버전 관리 메커니즘이 있기 때문에 서버에서 지원되는 서비스 버전을 플러그인 버전에로드시에 확인할 수 있습니다. 버전 관리는 서버가 제공하는 서비스의 버전 및 플러그인이 예기치 또는 필요로하는 서비스 버전 간의 호환성 문제가 방지됩니다.
현재 서비스에는 다음이 포함되어 있으며 다른 서비스도 구현할 수 있습니다.
my_plugin_log_service
: 플러그인 오류보고 및 에러 메세지의 지정을 할 수있는 서비스. 서버 오류 로그에 메시지를 씁니다.my_snprintf
: 플랫폼에서 일관된 결과를 생성하는 문자열의 서식 서비스.my_thd_scheduler
: 플러그인이 스레드 스케줄러를 선택하기위한 서비스입니다.mysql_string
: 문자열 조작을위한 서비스.thd_alloc
: 메모리 할당 서비스.thd_wait
: 플러그인이 절전 모드 또는 정지하는 것을보고하는 서비스.
플러그인 서비스 인터페이스와 플러그인 API의 차이점은 다음과 같습니다.
플러그인 API는 서버에서 플러그인을 사용할 수 있습니다. 호출을 시작하는 플러그인을 호출하는 서버입니다. 이렇게하면 서버 기능의 확장 또는 서버의 처리에 관한 통지를 받기위한 등록을 플러그인 할 수 있습니다.
플러그인 서비스 인터페이스에서는 플러그인은 서버 내부의 코드를 호출 할 수 있습니다. 호출을 시작하는 것은 서비스 함수를 호출 플러그인입니다. 이로 인해 많은 플러그인이 서버에 이미 구현되어있는 기능을 사용할 수있게 플러그인 개별적으로 기능을 구현할 필요가 없습니다.
서버를 변경하고 새로운 서비스를 추가하는 개발자는 플러그인을위한 MySQL 서비스 를 참조하십시오.
이 섹션의 나머지 부분에서는 서비스로 사용 가능한 서버 기능을 플러그인으로 사용하는 방법을 설명합니다. my_snprintf
서비스를 사용하는 "데몬"플러그인 예제 소스를 참조하십시오. 이 플러그인은 MySQL 소스 배포판의 plugin/daemon_example
디렉토리에 있습니다.
존재하는 서비스 및 서비스를 제공하는 함수를 확인하려면 MySQL 소스 배포판의 include/mysql
디렉토리를 참조하십시오. 관련 파일은 다음과 같습니다.
plugin.h
는services.h
을 포함합니다.services.h
는 사용 가능한 모든 서비스 고유의 헤더 파일을 포함하는 '포괄적 인'헤더입니다.서비스 고유의 헤더에는
service_my_snprintf.h
또는service_thd_alloc.h
같은 이름이 붙어 있습니다.
각 서비스 별 헤더는 대상이되는 서비스 전체 사용법을 설명하는 문서를 제공하는 코멘트가 사용 가능한 서비스 함수 그 호출 순서 및 반환 값이 포함되어 있습니다.
플러그인 내에서 서비스를 사용하려면 서비스 관련 정보에 액세스하기위한 plugin.h
헤더 파일을 플러그인의 소스 파일에 포함해야합니다.
#include <mysql/plugin.h>
따라서 설치 비용이 증가하지는 않습니다. 이 파일에는 모든 플러그인에 필요한 정의 및 구조가 포함되어 있기 때문에 플러그인은 어떤 경우에도이 파일을 포함해야합니다.
서비스에 액세스하기 위해 플러그인은 다른 함수와 마찬가지로 서비스 함수를 호출합니다. 예를 들어, 출력을 위해 문자열을 포맷하고 버퍼링 동일한 이름의 서비스가 제공되는 my_snprintf()
함수를 호출합니다.
char buffer[BUFFER_SIZE]; my_snprintf(buffer, sizeof(buffer),format_string
,argument_to_format
, ...);
서버가 오류 로그에 기록 오류를보고하려면 먼저 오류 수준을 선택합니다. mysql/service_my_plugin_log.h
는 이러한 수준을 정의하고 있습니다.
enum plugin_log_level { MY_ERROR_LEVEL, MY_WARNING_LEVEL, MY_INFORMATION_LEVEL };
그런 my_plugin_log_message()
를 호출합니다.
int my_plugin_log_message(MYSQL_PLUGIN *plugin, enum plugin_log_level level, const char *format, ...);
Example:
my_plugin_log_message(plugin_ptr, MY_ERROR_LEVEL, "Cannot initialize plugin");
플러그인을 빌드 할 때 libmysqlservices
라이브러리에 링크해야합니다. 링크시에는 -lmysqlservices
플래그를 사용합니다. 예를 들어 CMake의 경우 최상위 CMakeLists.txt
파일에 다음의 내용을 지정합니다.
FIND_LIBRARY(MYSQLSERVICES_LIB mysqlservices PATHS "${MYSQL_SRCDIR}/libservices" NO_DEFAULT_PATH)
플러그인의 소스가 저장되어있는 디렉토리의 CMakeLists.txt
파일에 다음의 내용을 지정합니다.
# the plugin needs the mysql services library for error logging
TARGET_LINK_LIBRARIES (your_plugin_library_name
${MYSQLSERVICES_LIB})