以下特指WINDOW平台下MYSQL源码。
要使用mysql数据库来作为我们的数据管理工具,我们首先要安装mysql或下载一个压缩包解压。但不管是那一种方式,都需要启动mysqld服务,使用过mysql的都知道。(在mysql的bin目录下有一个文件mysqld.exe文件.)mysql服务器启动后我们才能够连接到数据库进行数据的增删插改等查找。
今天对mysqld的源码进行了了解,其主要就是实现了创建和安装window服务,并开启业务处理线程。
先看看mysqld工程下的目录文件。nt_servc.h头文件,封装了Windows服务创建、安装、启动等操作。main.cc包含了一个main函数,调用mysqld_main函数。
两个.rc文件,一个定义版本号另一个应该是定义提示信息的吧。对该文件未进行了解。net_servc.h,nt_servc.h的实现文件。
另一个重要文件就是mysqld.cc.由于入口函数main一开始就调用了改文件中的mysqld_main函数,因此该函数相当于mysql服务启动的入口。
下面本人是本人针对从源码中学到的知识进行记录。
/*
When several instances are running on the same machine, we
need to have an unique named hEventShudown through the
application PID e.g.: MySQLShutdown1890; MySQLShutdown2342
此处是指在同一台机器上运行几个mysql实例的时候,怎么分辨它们,
就是通过各个实例的进程号进行分辨。函数如下:
*/
int10_to_str((int) GetCurrentProcessId(),strmov(shutdown_event_name,
"MySQLShutdown"), 10);
在此首先是strmov函数的实现,
char *strmov(register char *dst, register const char *src)
{
while ((*dst++ = *src++)) ;
//返回结束字符位置指针,可以据此计算拷贝到dst中的字符长度。
//当然此处的目的是为了继续在dst后添加该MYSQL实例进程的ID字符串
return dst-1;
}
下面代码是将整形转换成字符串并将其添加到dst字符串末尾,从而达到程序开始说的实现标识一台机器上的多个mysql实例。
(本来是用代码工具,不知为什么不能够显示出代码来)
char *int10_to_str(long int val,char *dst,int radix)
{
char buffer[65];
register char *p;
long int new_val;
unsigned long int uval = (unsigned long int) val;
if (radix < 0) /* -10 */
{
if (val < 0)
{
*dst++ = '-';
/* Avoid integer overflow in (-val) for LONGLONG_MIN (BUG#31799). */
uval = (unsigned long int)0 - uval;
}
}
//从后向前,避免移动已插入字符
p = &buffer[sizeof(buffer)-1];
*p = '/0';
new_val= (long) (uval / 10);
*--p = '0'+ (char) (uval - (unsigned long) new_val * 10);
val = new_val;
while (val != 0)
{
new_val=val/10;
*--p = '0' + (char) (val-new_val*10);
val= new_val;
}
while ((*dst++ = *p++) != 0) ;
return dst-1;
}
下面就是启动服务了。服务完全就是对C的几个API进行了封装。下次写出来,已算是对创建Windows服务的复习了。对了,在调用服务Server.OS前还有一句代码,如下:
/* Must be initialized early for comparison of service name */
system_charset_info= &my_charset_utf8_general_ci;
该变量定义如下,
CHARSET_INFO *system_charset_info, *files_charset_info ;
CHARSET_INFO结构真是一个庞大的结构,要得好好肯一番才能继续。虽然它和前面的服务没任何关系。还是先从它开始吧。