1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > mysql插件开发_mysql的插件开发记录

mysql插件开发_mysql的插件开发记录

时间:2024-01-23 10:25:57

相关推荐

mysql插件开发_mysql的插件开发记录

环境:

操作系统:window8.1

cygwin:x86_64

mysql:Generic Linux (Architecture Independent) 5.6.17

一、插件编写

1、创建目录

在mysql的插件源码目录(plugin)创建插件目录

2、编写代码

创建cc文件(c文件会导致编译错误),内容参考下面的源码

3、编写CMake文件

参考CMake文件

4、生成Make文件

回到mysql源码根目录,参考相关资料2中的生成makefile的操作

5、编译

进入1中目录,执行make命令

6、拷贝文件到mysql安装目录的lib/plugin

7、安装插件

INSTALL PLUGIN mytest SONAME 'TestJyx.dll';

其他操作:

1、展开宏定义,用于观察宏的定义

g++ -I/cygdrive/e/opensource/mysql/mysql-5.6.17-win/mysql-5.6.17/include -I/cygdrive/e/opensource/mysql/mysql-5.6.17-win/mysql-5.6.17/sql -DMYSQL_DYNAMIC_PLUGIN -E TestJyx.c > TestJyx.e

相关资料

1、http://www.hoterran.info/mysql-daemon-plugin-example

2、/northhurricane/p/3665120.html

源码

/* This program is free software; you can redistribute it and/or modify

it under the terms of the GNU General Public License as published by

the Free Software Foundation; version 2 of the License.

This program is distributed in the hope that it will be useful,

but WITHOUT ANY WARRANTY; without even the implied warranty of

MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the

GNU General Public License for more details.

You should have received a copy of the GNU General Public License

along with this program; if not, write to the Free Software

Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */

/* follow mysql daemon_example.

Since GB code and UTF-8 code will lead conflict of displaying, I wiil use my poor English to comment.*/

#include "my_global.h"

#include "sql_priv.h"

#include "stdlib.h"

#include "ctype.h"

#include "mysql_version.h"

#include "mysql/plugin.h"

#include "my_dir.h"

#include "my_pthread.h" // pthread_handler_t

#include "my_sys.h" // my_write, my_malloc

#include "m_string.h" // strlen

#include "sql_plugin.h" // st_plugin_int. retrieve plugin runtime infomation

//record this plugin's infomation. Although we can use static variables, why not try this?

struct mytest_context

{

pthread_t mytest_thread; //thread of myself

};

char buffer[100];

char*

mytest_get_current_time()

{

time_t result;

struct tm tm_tmp;

result= time(NULL);

localtime_r(&result, &tm_tmp);

my_snprintf(buffer, sizeof(buffer),

"show me at %02d%02d%02d %2d:%02d:%02d\n",

tm_tmp.tm_year % 100,

tm_tmp.tm_mon+1,

tm_tmp.tm_mday,

tm_tmp.tm_hour,

tm_tmp.tm_min,

tm_tmp.tm_sec);

return buffer;

}

pthread_handler_t mytest_showme(void *p)

{

DBUG_ENTER("mytest_showme");

while(1)

{

sleep(5);

char *current_time = mytest_get_current_time();

fprintf(stderr, current_time);

}

DBUG_RETURN(0);

}

/*

Initialize this plugin at server start or plugin installation.

SYNOPSIS

mytest_plugin_init()

DESCRIPTION

Starts up mytest_showme thread

RETURN VALUE

0 success

1 failure (cannot happen)

*/

static int mytest_plugin_init(void *p)

{

DBUG_ENTER("mytest_plugin_init");

struct mytest_context *con;

pthread_attr_t attr; /* Thread attributes */

struct st_plugin_int *plugin= (struct st_plugin_int *)p;

con = (struct mytest_context *)

my_malloc(sizeof(struct mytest_context), MYF(0));

pthread_attr_init(&attr);

pthread_attr_setdetachstate(&attr,

PTHREAD_CREATE_JOINABLE);

/* now create the thread */

if (pthread_create(&con->mytest_thread, &attr, mytest_showme,

(void *)con) != 0)

{

fprintf(stderr,"Could not create heartbeat thread!\n");

DBUG_RETURN(1);

}

plugin->data= (void *)con;

fprintf(stderr,"Initialize success!\n");

DBUG_RETURN(0);

}

/*

Terminate this plugin at server shutdown or plugin deinstallation.

SYNOPSIS

mytest_plugin_deinit()

Does nothing.

RETURN VALUE

0 success

1 failure (cannot happen)

*/

static int mytest_plugin_deinit(void *p)

{

DBUG_ENTER("mytest_plugin_deinit");

struct st_plugin_int *plugin= (struct st_plugin_int *)p;

struct mytest_context *con=

(struct mytest_context *)plugin->data;

void *dummy_retval;

pthread_cancel(con->mytest_thread);

/*

Need to wait for the hearbeat thread to terminate before closing

the file it writes to and freeing the memory it uses

*/

pthread_join(con->mytest_thread, &dummy_retval);

my_free(con);

fprintf(stderr,"Deinitialize success!\n");

DBUG_RETURN(0);

}

struct st_mysql_daemon mytest_plugin=

{ MYSQL_DAEMON_INTERFACE_VERSION };

/*

Plugin library descriptor

*/

mysql_declare_plugin(daemon_example)

{

MYSQL_DAEMON_PLUGIN,

&mytest_plugin,

"mytest", /* the plugin name of sql "INSTALL PLUGIN plugin_name SONAME 'plugin_library'" */

"OldJ",

"Mytest, show info",

PLUGIN_LICENSE_GPL,

mytest_plugin_init, /* Plugin Init */

mytest_plugin_deinit, /* Plugin Deinit */

0x0100 /* 1.0 */,

NULL, /* status variables */

NULL, /* system variables */

NULL, /* config options */

0, /* flags */

}

mysql_declare_plugin_end;

CMakeLists.txt文件

MYSQL_ADD_PLUGIN(TestJyx

MODULE_ONLY MODULE_OUTPUT_NAME "TestJyx")

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。