mysqld工程学习(一):两个基本函数的学习strmov和int10_to_str

来源:互联网 发布:系统网络架构设计 编辑:程序博客网 时间:2024/06/08 10:29

   以下特指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结构真是一个庞大的结构,要得好好肯一番才能继续。虽然它和前面的服务没任何关系。还是先从它开始吧。

 

 

 

 

 

 

原创粉丝点击