mysql+设置+variable_探索MYSQL源代码–添加一个VARIABLE

我们来为mysql添加一个variable, 名字是options_hoterrans,要达到的效果如下

mysql> show variables like '%hoterrans%';

+------------------+-------+

| Variable_name | Value |

+------------------+-------+

| options_hoterrans | 4 |

+------------------+-------+

1 row in set (0.00 sec)

mysql里的variable 有一部分是来自于my.cnf里的option。为了添加一个可配置的variale, 我们先来添加一个option, 名字是options_hoterran,没有s。

sql/mysqld.cc 查找关键字 my_long_options, 会找到一个很大的类型为my_options的结构体,这个结构体用于存储所有的long_options。

我们调到这个结构体的尾部,可以利用vim的{键。

在结构体的尾部有个哨兵,我们的选项就添加到哨兵的前面

struct my_option my_long_options[] =

....

{"wait_timeout", OPT_WAIT_TIMEOUT,

"The number of seconds the server waits for activity on a connection before closing it.",

(uchar**) &global_system_variables.net_wait_timeout,

(uchar**) &max_system_variables.net_wait_timeout, 0, GET_ULONG,

REQUIRED_ARG, NET_WAIT_TIMEOUT, 1, IF_WIN(INT_MAX32/1000, LONG_TIMEOUT),

0, 1, 0},

/* start*/

{"options_hoterran", OPT_HOTERRAN,

"This is option just for test",

(uchar**) &global_system_variables.opt_hoterran,

NULL,

0, GET_ULONG,

REQUIRED_ARG, 2, 1, 1000,

0, 1, 0

},

/* end */

{0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}

};

/*start*/ /*end*/ 之间的就是我们所添加的代码,下同。

简单介绍一下my_option这个结构体

struct my_option

{

const char *name; /* Name of the option */

int id; /* unique id or short option */

const char *comment; /* option comment, for autom. --help */

uchar **value; /* The variable value */

uchar **u_max_value; /* The user def. max variable value */

struct st_typelib *typelib; /* Pointer to possible values */

ulong var_type;

enum get_opt_arg_type arg_type;

longlong def_value; /* Default value */

longlong min_value; /* Min allowed value */

longlong max_value; /* Max allowed value */

longlong sub_size; /* Subtract this from given value */

long block_size; /* Value should be a mult. of this */

void *app_type; /* To be used by an application */

};

我们要注意其中2个字段, id:option的内部序列号; typelib:option的值指向了一个地址。

所以我们还需要添加这2个变量。

sql/mysqld.cc 里查找关键字enum options_mysqld,在这个枚举中我们添加一个枚举类型

OPT_SLOW_QUERY_LOG_FILE,

+ /*rry start*/

+ OPT_HOTERRAN,

+ /*rry end*/

OPT_IGNORE_BUILTIN_INNODB

};

转到global_system_variables的类型system_variables定义处,sql/sql_class.h里。

在system_variables最末尾添加一个变量

my_bool sysdate_is_now;

/*start*/

u_long opt_hoterran;

/*end*/

};

目前为止,我们已经添加一个option, 你可以在my.cnf 添加

[mysqld]

....

options_hoterran=4

这个参数会被mysqld采用。

继续添加variable, 只要把上面的option与variable关联上即可。

打开sql/set_var.cc 文件,找到关键字net_wait_timeout, 修改后效果如下

static sys_var_thd_ulong sys_net_wait_timeout(&vars, "wait_timeout",

&SV::net_wait_timeout);

+/*start*/

+static sys_var_thd_ulong sys_opt_hoterran(&vars, "options_hoterrans",

+ &SV::opt_hoterran);

+/*end*/

这里是创建一个名为sys_opt_hoterran 的 sys_var_thd_ulong类,这个类的构造函数实际上就是在vars这个全局变量chain中添加一个名为options_hoterrans的variable。

SV就是上面options里的global_system_variables。

我们来看效果。

make&&make install

这里会比较慢,因为sql/sql_class.h 这个文件被修改了,而reference这个文件的target很多。

重启mysqld,mysql登上去

mysql> show variables like '%hoterrans%';

+-------------------+-------+

| Variable_name | Value |

+-------------------+-------+

| options_hoterrans | 5 |

+-------------------+-------+

1 row in set (0.00 sec)

觉得文章有用?立即:

和朋友一起 共学习 共进步!

猜您喜欢

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值