初看mysql源代码之mysql.cc

在mysql的源代码目录中,sql目录是mysql源代码中经常变化的目录之一,也是MySQL服务器内核最为核心和重要的目录。

sql目录除了包含mysqld.cc这一MySQL main函数所在文件外,还包括了各类SQL语句的解析/实现。

在sql目录下的main.cc里面就调用了一个mysqld_main(),但是mysql里面好像有一个win_main()和mysqld_main(),

当时我就比较奇怪,刚好一个对应于windows一个对应于linux下的呀。当时想了半天,没搞明白。后来又看了一遍mysqld_main.cc,才有点看明白了。

实际上在windows下和linuxmysql服务器启动的环境和方式是不一样的,但是mysql为了偷懒只搞了一套源代码,这样发布项目的时候是方便了,尼玛windows和linux只要一套源代码就行了,但是读起来错综复杂的,各种条件编译命令眼花缭乱,让你看不清真相。

mysql在windows和linux上启动服务的过程有一部分代码是相似的,这一部分代码就根据是否定义了_WIN32来决定是命名为win_main()还是mysqld_main();如果是命名为win_main()那么我们在后面还要有一个mysqld_main()来调用这个win_main(),而如果是mysqld_main(),那么后面另外一个mysqld_main()就不需要再定义了。

#ifdef _WIN32	// 如果定义了_WIN32,则会编译win_main()
int win_main(int argc, char **argv)
#else
int mysqld_main(int argc, char **argv)	// 如果没有定义了_WIN32,则会编译mysqld_main()
{
	// 这个是windows上和linux服务器启动时代码相同的部分
	// 当然里面也有很多的编译预处理命令
}
#endif

#if defined(_WIN32)
int mysqld_main(int argc, char **argv)
{
	// 这里是用于windows上的mysqld_main();
}
#endif // _WIN32     这个endif对应于 5021行的if defined(_WIN32)

就是这几个编译命令决定了是走向windows还是linux,下面我们再来看看mysqld_main()是如何调用win_main()的,

如果你在mysqld_main()直接找win_main()那是找不到滴,这里呢在有个函数叫mysql_service(void *p):

#if defined(_WIN32)				// 如果定义了_WIN32
int mysql_service(void *p)	// 居然是在这儿调用了win_main()
{
  if (my_thread_init())
  {
    flush_error_log_messages();
    return 1;
  }

  if (use_opt_args)
    win_main(opt_argc, opt_argv);	// 对于win_main()的调用
  else
    win_main(Service.my_argc, Service.my_argv);// 对于win_main()的调用

  my_thread_end();
  return 0;
}

哈哈,找到了对win_main()的调用,所以可以肯定mysqld_main()里面也调用了mysql_service(void *p):

找找看,果真有

if (Service.GetOS())  /* true NT family */		// 也就是说这个是用于NT上的
{
	char file_path[FN_REFLEN];
    my_path(file_path, argv[0], "");          /* Find name in path */
    fn_format(file_path,argv[0],file_path,"",
              MY_REPLACE_DIR | MY_UNPACK_FILENAME | MY_RESOLVE_SYMLINKS);

    if (argc == 2)
    {
		if (!default_service_handling(argv, MYSQL_SERVICENAME, MYSQL_SERVICENAME,
                                    file_path, "", NULL))
			return 0;
		if (Service.IsService(argv[1]))        /* Start an optional service */
		{
			/*
				Only add the service name to the groups read from the config file
				if it‘s not "MySQL". (The default service name should be ‘mysqld‘
				but we started a bad tradition by calling it MySQL from the start
				and we are now stuck with it.
			*/
			if (my_strcasecmp(system_charset_info, argv[1],"mysql"))
				load_default_groups[load_default_groups_sz-2]= argv[1];
			windows_service= true;
			Service.Init(argv[1], mysql_service);	// 这个里面调用了mysql_service,也就是说会间接的调用到win_main()
			return 0;
		}
    }
    else if (argc == 3) /* install or remove any optional service */
    {
		if (!default_service_handling(argv, argv[2], argv[2], file_path, "",
                                    NULL))
			return 0;
		if (Service.IsService(argv[2]))
		{
			/*
				mysqld was started as
				mysqld --defaults-file=my_path\my.ini service-name
			*/
			use_opt_args=1;
			opt_argc= 2;        // Skip service-name
			opt_argv=argv;
			windows_service= true;
			if (my_strcasecmp(system_charset_info, argv[2],"mysql"))
				load_default_groups[load_default_groups_sz-2]= argv[2];
			Service.Init(argv[2], mysql_service);
			// 这个里面调用了mysql_service,也就是说会间接的调用到win_main()
			return 0;
		}
    }
    else if (argc == 4 || argc == 5)
    {
		/*
			This may seem strange, because we handle --local-service while
			preserving 4.1‘s behavior of allowing any one other argument that is
			passed to the service on startup. (The assumption is that this is
			--defaults-file=file, but that was not enforced in 4.1, so we don‘t
			enforce it here.)
		*/
		const char *extra_opt= NullS;
		const char *account_name = NullS;
		int index;
		for (index = 3; index < argc; index++)
		{
			if (!strcmp(argv[index], "--local-service"))
				account_name= "NT AUTHORITY\\LocalService";
			else
			extra_opt= argv[index];
		}

		if (argc == 4 || account_name)
			if (!default_service_handling(argv, argv[2], argv[2], file_path,
                                      extra_opt, account_name))
				return 0;
	}
    else if (argc == 1 && Service.IsService(MYSQL_SERVICENAME))
    {
		/* start the default service */
		windows_service= true;
		Service.Init(MYSQL_SERVICENAME, mysql_service);
		// 这个里面调用了mysql_service,也就是说会间接的调用到win_main()
		return 0;
    }
}

就看了这一点先写这么多?

时间: 2024-10-12 07:08:54

初看mysql源代码之mysql.cc的相关文章

Win7+VS2010:mysql 源代码编译与调试

win7+vs2010源代码编译mysql 近期因为在实习,工作重点在于一些数据库的开发,为了更好的理解数据库的实现机制.眼下萌生了要研究一下mysql数据库源代码的想法.那么好吧,说干就干.首先我们须要实现对源代码的编译.这里我们选择win7+VS2010来实现,可是试了非常多次都失败了.这是我多次配置环境时遇到的问题,各种博客文章总是不太全然,或者说没有说明一些遇到的问题的解决方式,这可能跟详细的操作系统和环境有关.本文就说说我安装的情况. 1. 准备工作 (1)OS:win7 旗舰版 64

MySQL 源代码scr.rpm安装的一点注意事项

rpm安装包通常为二进制包(Binary)以及源代码包(Source)两种形式. 在使用源代码方式安装MySQL的时候,官方站点上下载的源代码包通常为scr.rpm格式,而不是直接的tar包.对此,须要先使用rpm命令先安装源代码后在进行编译安装.本文是对该方式的描写叙述. 1.下载源代码包  http://mirrors.sohu.com/mysql/MySQL-5.6/  http://dev.mysql.com/downloads/mysql/ 2.安装rpm#环境suse11:~ # c

MYSQL 源代码 编译原理 AST和解析树 代码语法解析

MYSQL 源代码 编译原理 AST和解析树 代码语法解析 http://blog.csdn.net/wfp458113181wfp/article/details/17082355 使用AST树 分类:             antlr              2013-12-02 22:39     255人阅读     评论(0)     收藏     举报 目录(?)[+] 第五章使用AST树中间结果来计算表达式值 创建ASTS 第五章.使用AST树中间结果来计算表达式值 现在我们已

mysql源代码安装细说

mysql为我们提供了三种安装方式:二进制.rpm.源代码编译.这里我们详细讨论mysql的源代码编译安装方式. 在5.5版本之后,mysql不再提供configure编译方式,改为使用cmake编译工具,cmake工具的一个显著特点是其编译独立于源代码,即我们可以在源代码之外的目录使用cmake来编译mysql,如 [[email protected] tmp]# ls -l | grep mysql drwxr-xr-x 2 root root 4096 4月 29 21:11 mysql2

LINUX下如何编译MYSQL源代码

LINUX下如何编译MYSQL源代码 Linux下面编译MYSQL的源代码方式如下: 首先下载源代码:选择下面这个版本: 下载相应的CMake, gcc, bison等所依赖组件: a) 安装cursor library: b) 安装gcc 和 gcc-c++ c) 下载boost:  用g++ 或者根据不同的参数,指定参数,然后运行CMAKE: cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_DATADIR=/usr/loca

mysql在linux上的安装之二(mysql源代码安装)

1.下载对应的mysql安装源代码包 地址为:http://dev.mysql.com/downloads/mysql/5.1.html 2.假设曾经安装过则卸载无用过旧的已安装的mysql 因为非常多linux发行版,都预装了对应的mysql,一般都是rpm形式的安装,且mysql的版本号都是比較低的(这个可能是因为兼容性測试的考虑吧).因此在自己亲自安装mysql之前,请先卸载这些过旧的mysql,保证我们系统的"纯净". 使用例如以下命令查询系统中安装的mysql: rpm -q

源代码安装Mysql

实验运行环境:centos-6.5  软件包mysql-5.6.10.tar  mysql-5.5.15-linux2.6-i686.tar  cmake-2.8.10.2.tar 安装源代码MySQL 1首先到MySQL官网下载最新版的MySQL安装包的源代码 2.安装之前查看你的系统上关于MySQL相关的软件包,把它卸载掉(不然会影响到MySQL的安装) 3.解压包MySQL到/usr/local/src下,打开INSTALL-SOURCE 查看安装帮助信息 **** 接下来可以用cmake

MySQL监控系统MySQL MTOP的搭建

MySQLMTOP是一个由Python+PHP开发的MySQL企业级监控系统.系统由Python实现多进程数据采集和告警,PHP实现WEB展示和管理.最重要是MySQL服务器无需安装任何Agent,只需在监控WEB界面配置相关数据库信息 功能非常强大: 可对上百台MySQL数据库的状态.连接数.QTS.TPS.数据库流量.复制.性能等进行时时监控 能在数据库偏离设定的正常运行阀值(如连接异常,复制异常,复制延迟) 时发送告警邮件通知到DBA进行处理 对历史数据归档,通过图表展示出数据库近期状态,

MySQL Study之--MySQL下图形工具的使用(phpMyAdmin)

MySQL Study之--MySQL下图形工具的使用(phpMyAdmin) 系统环境: RedHat EL6 数据库:  MySQL 5.6.4-m7 phpMyAdmin是一个用PHP编写的软件工具,是以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库.借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便.其中一个更大的优势在于由于phpMyAdmin跟其他PHP