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结构真是一个庞大的结构,要得好好肯一番才能继续。虽然它和前面的服务没任何关系。还是先从它开始吧。
- mysqld工程学习(一):两个基本函数的学习strmov和int10_to_str
- mysqld工程学习(一):CHARSET_INFO
- Oracle和Mysqld的时间函数
- Android学习(一)创建一个基本的活动及基本的几个函数
- 逆向工程核心原理学习笔记(一):寻找程序的主函数(Main)
- 逆向工程核心原理学习笔记(一):寻找程序的主函数(Main)
- python学习笔记(一)--基本操作和基本类型
- JNI 学习笔记(一)-- JNI函数调用流程,JNI理解和基本数据类型
- Python3的基本语法学习(一)
- 汇编语言学习笔记(八)数据处理的两个基本问题
- mysqld的安装和基本增删改查
- 《Javascript语言精粹》的学习(一).对象和函数
- Oracle学习之基本语法(一)—内置函数
- Kaggle学习(一):numpy基本函数使用
- 【VS2010学习笔记】【函数学习】一(VC6.0和VS2010主函数的不同)
- Scala 学习(一)--- 方法和函数
- 类的基本函数学习
- 工程化管理Makefile的学习(一)
- Android JNI开发入门
- Generic Host process for Win32 service 解决办法
- DiskGenius是一款磁盘分区及数据恢复软件
- magento -- 客户无法使用contact us 发邮件
- fortran F90动态数组的基本使用示范
- mysqld工程学习(一):两个基本函数的学习strmov和int10_to_str
- 主流Java报表软件之王者争夺战:功能大PK系列之图表标题背景
- LPC2468-ISP擦除
- 双系统启动grub.conf
- 解决错误Error creating bean with name 'MySessionFactory' defined in class path resource [applicationContext.xml]: Invocation of init
- Hibernate 中save方法运行成功之后却没有保存进数据库的原因
- android之DPAD上下左右四个键控制
- 开篇
- 最简单和VBA程序(宏)