我先介绍了网络通信的Vio,正常来说,接下来我应该按照SQL的路径,介绍网络协议,再介绍命令接收,SQL解析,计划优化等一路跟踪下去,但我不打算这么干。这主要是因为认识一个庞然大物,往往我们只能看见其冰山一角,整个Mysql来说就是这样的庞然大物,我不可能一下子从头到尾完全整明白全部,所以我打算先看其主要的一些必备工具。
今天我先从strings工具开始:
bchange
参数:
register uchar *dst 目标串开始指针
size_t old_length 目标串长度
register const uchar *src, 新串开始指针
size_t new_length 新串长度
size_t tot_length 总的长度
功能:
用src中的new_length的字符替换dst中的前old_length的字符,其中的tot_length表示原始字符串的总长度。
5.6的代码看起来明显有问题,没有考虑src和desc的开始位置,具体代码如下:
size_t rest=tot_length-old_length;
if (old_length< new_length)
bmove_upp(dst+rest+new_length,dst+tot_length,rest);
else
bmove(dst+new_length,dst+old_length,rest);
memcpy(dst,src,new_length);
我看了一下5.7的最新代码,果然已经对其进行了修改,目前实现如下:
memmove(dst +new_length, dst + old_length, tot_length - old_length);
memcpy(dst,src,new_length);
bmove_upp
参数:
register uchar *dst 目标字符串的结束地址
register const uchar *src 原始字符串的结束地址
register size_t len 拷贝的字符串长度
功能:
将长度为len的src指向的字符串从末尾开始拷贝到dst为结尾的空间。
字符集支持
Big5、bin、cp932、czech、eucjpms、extra、gb2312、gbk、latin1、mb、simple、sjis、tis620、uca、ucs2、ujis、utf8、win1250ch
其中定义了一些工具宏、静态数组和处理函数
decimal
其中包含decimal的各种处理函数,要详细了解decimal类型可以仔细看次文件。
dtoa
将浮点数和字符串互相转换的处理函数。
要想将一个字符串转换成一个浮点数,我详细大部分人都能写一个函数进行正确的转换,但要实现将一个字符串正确的转换成一个浮点数,还是很有学问的。感兴趣的可以仔细看看这个文件中的dtoa函数,可以看到此函数还是非常复杂的。
int2str
将int转换成某个进制的字符串,还提供了一个优化了的将int转换成10进制串的函数。
其中llstr、longlong2str也是类似的功能。
is_prefix
判断一个串是两一个串的前缀。
my_strchr
判断一个字符是否在字符串中出现过。
my_strtoll10
将一个字符串转换为10进制的数。
str2int的功能类似,是将字符串转换成一个整数。
str_alloc
给字符串申请内存空间
strappend
将一个字符串末尾填充成指定的字符,我估计这是为char类型准备的。
strcend
在字符串中找到一个字符出现的位置,如果没有找到,就返回字符串的末尾。
strcont
在一个字符串中查找一个子串是否存在,如果存在就返回其指针,否则返回NULL
strend
找到字符串的结束位置。
strfill
将一个字符串的一段空间用某个字符填充。
strmake
将原始字符串拷贝到目的串中,并返回起结束位置,这应该在字符串连接过程中非常有用。
strnmov和次函数的功能类似。
strmov
将原始字符串拷贝到目的字符串,并返回结束位置。
strxmov
将n个字符串合并成一个字符串返回。
strxnmov
安全的字符串合并函数。
xml
Xml的一些操作,这里不再详细说明。
可以看到这里提供的很多函数,常见系统的库函数中都有此功能,可能不够高效或者为了避免移植性的问题,从而自己实现了这些函数。




