C_SourceCode_Of_MYSQL 下载地址:http://www.mysql.com/downloads/mysql/,其中包括好多版本选Windows (x86, 32-bit), ZIP Archive版本
先说C的开发环境吧,目前有VC6.0,VS.NET,eclipse-cpp-helios等,也还有其他的版本或者专业的开发版本我们在这就不一一介绍了,简单说说这三种开发工具,vc6.0更多的是针对C语言的开发,当然现在微软推出的VS.NET已基本可以代替其的开发,且vs.NET经过几年的发展已比较成熟,一些常用的功能已基本囊括,推荐通过此工具学习C语言,在此我使用的eclipse-cpp-helios来学习,因为其操作界面与JAVA已基本相同,且头文件的引用,代码调用方法的快速查找有很强大的功能,为了便于学习,所以使用此工具学习,刚看MYSQL的源码感觉有点小晕,系统比较大感觉无从下手,一般学一种新的框架我首先会查看其目录结构,然后看其配置文件,总之一切以找到程序的入口为入口,鉴于此系统比较庞大我们会在一段时间的学习积累后,系统的学习此系统,目前我们的出发点是先从核心文件开始吧。
首先先看mysql.h和mysql.c两个文件把,我们会发现,我们平时操作的表,原来在C语言中都是对应的一个个的结构体,Mysql中将其定义为了自定义类型,让我们仔细看下其包含的结构体吧。
以下类型我们将一一进行查看:
my_socket, MYSQL_FIELD, MYSQL_ROW,MYSQL_FIELD_OFFSET,MYSQL_ROWS,MYSQL_ROW_OFFSET,EMBEDDED_QUERY_RESULT,MYSQL_DATA,MY_CHARSET_INFO,MYSQL,MYSQL_RES,MYSQL_MANAGER,MYSQL_PARAMETERS,MYSQL_BIND,MYSQL_STMT,MYSQL_METHODS,以上的结构体我们将对其代码一一查看,分析MYSQL的工作机制及其工作原理。
1.套接字 my_socket,其定义比较简单,不加太多解释
#ifndef my_socket_defined
#ifdef __WIN__
#define my_socket SOCKET
#else
typedef int my_socket;
2.MYSQL字段结构体 MYSQL_FIELD
typedef struct st_mysql_field {
char *name; /* Name of column 字段名称 */
char *org_name; /* Original column name, if an alias 字段别名*/
char *table; /* Table of column if column was a field 所属表*/
char *org_table; /* Org table name, if table was an alias 表的别名*/
char *db; /* Database for table 表的数据*/
char *catalog; /* Catalog for table 表的目录*/
char *def; /* Default value (set by mysql_list_fields) 默认值*/
unsigned long length; /* Width of column (create length) 字段的长度*/
unsigned long max_length; /* Max width for selected set 最大可选择的长度*/
unsigned int name_length; /* 字段名的长度*/
unsigned int org_name_length;
unsigned int table_length;
unsigned int org_table_length;
unsigned int db_length;
unsigned int catalog_length;
unsigned int def_length;
unsigned int flags; /* Div flags 层标记,未完全理解,有待后续解决*/
unsigned int decimals; /* Number of decimals in field 小数位数*/
unsigned int charsetnr; /* Character set 字符集*/
enum enum_field_types type; /* Type of field. See mysql_com.h for types 字段的类型*/
void *extension; /*未定后续解决*/
} MYSQL_FIELD;
通过以上的定义我们很清楚的看到,字段类型其实比较简单。难点在其类型,枚举类型
关于枚举类型的学习会在接下来的时间学习。
3.MYSQL_ROW 单行比较简单
typedef char **MYSQL_ROW; /* return data as array of strings */
4.MYSQL_FIELD_OFFSET:当前字段的偏移量量
typedef unsigned int MYSQL_FIELD_OFFSET; /* offset to current field */
5.MYSQL_ROWS多行数据,其原理是通过一个单向链表实现的,关于链表不再详细介绍
typedef struct st_mysql_rows {
struct st_mysql_rows *next; /* list of rows 下一条记录*/
MYSQL_ROW data; /*当前行的数据*/
unsigned long length; /*数据的长度*/
} MYSQL_ROWS;
6.EMBEDDED_QUERY_RESULT:未定接下来补充学习
typedef struct embedded_query_result EMBEDDED_QUERY_RESULT;
7.MYSQL_DATA :MYSQL数据
typedef struct st_mysql_data {
MYSQL_ROWS *data; /*所有数据行*/
struct embedded_query_result *embedded_info;
MEM_ROOT alloc; /*补充学习内容:MEM_ROOT见my_alloc.h文件,是与内存相关的内容*/
my_ulonglong rows; /*记录条数*/
unsigned int fields; /*字段个数*/
/* extra info for embedded library */
void *extension;
} MYSQL_DATA;
通过以上我们基本可以看到MYSQL的工作原理了,其操作的数据将通过以上结构体进行相应的操作。
8.MY_CHARSET_INFO:字符集信息(后续学习其用法)
typedef struct character_set
{
unsigned int number; /* character set number */
unsigned int state; /* character set state */
const char *csname; /* collation name */
const char *name; /* character set name */
const char *comment; /* comment */
const char *dir; /* character set directory */
unsigned int mbminlen; /* min. length for multibyte strings */
unsigned int mbmaxlen; /* max. length for multibyte strings */
} MY_CHARSET_INFO;
9.MYSQL:MYSQL结构体
typedef struct st_mysql
{
NET net; /* Communication parameters 通讯参数,网络相关*/
unsigned char *connector_fd; /* ConnectorFd for SSL 加密套接字协议层*/
char *host,*user,*passwd,*unix_socket,*server_version,*host_info; /*数据库用户名,密码,主机名,Unix套接字,版本,主机信息*/
char *info, *db;
struct charset_info_st *charset;
MYSQL_FIELD *fields; /*字段列表*/
MEM_ROOT field_alloc;
my_ulonglong affected_rows;
my_ulonglong insert_id; /* id if insert on table with NEXTNR 下一条记录的ID*/
my_ulonglong extra_info; /* Not used 未使用*/
unsigned long thread_id; /* Id for connection in server 数据库服务器中的连接ID*/
unsigned long packet_length;
unsigned int port; /*端口*/
unsigned long client_flag,server_capabilities; /*客户端状态,服务器服务*/
unsigned int protocol_version; /*协议版本*/
unsigned int field_count; /*字段个数*/
unsigned int server_status; /*数据库状态*/
unsigned int server_language; /*数据库语言*/
unsigned int warning_count; /*错误条数*/
struct st_mysql_options options; /*后续学习*/
enum mysql_status status;
my_bool free_me; /* If free in mysql_close 是否关闭*/
my_bool reconnect; /* set to 1 if automatic reconnect 是否自动连接*/
/* session-wide random string */
char scramble[SCRAMBLE_LENGTH+1];
/*
Set if this is the original connection, not a master or a slave we have
added though mysql_rpl_probe() or mysql_set_master()/ mysql_add_slave()
*/
my_bool rpl_pivot;
/*
Pointers to the master, and the next slave connections, points to
itself if lone connection.
*/
struct st_mysql* master, *next_slave; /*系统数据库,自定义数据哭*/
struct st_mysql* last_used_slave; /* needed for round-robin slave pick 端节点数据库*/
/* needed for send/read/store/use result to work correctly with replication */
struct st_mysql* last_used_con; /*最后一个连接*/
LIST *stmts; /* list of all statements 执行语句*/
const struct st_mysql_methods *methods; /*所有方法*/
void *thd;
/*
Points to boolean flag in MYSQL_RES or MYSQL_STMT. We set this flag
from mysql_stmt_close if close had to cancel result set of this object.
*/
my_bool *unbuffered_fetch_owner;
/* needed for embedded server - no net buffer to store the 'info' */
char *info_buffer;
void *extension;
} MYSQL;
通过以上我们看出,数据MYSQL主要包括网络编程,数据库相关信息,数据库数据,客户端信息,连接,需要执行的语句列表,
所有的方法,等信息,通过以上的分析,一个MYSQL数据库未知的领域基本映入眼帘,同时让我们基本了解了其保存的内容,和
简单的工作机制。
10.MYSQL_RES:mysql结果集
typedef struct st_mysql_res {
my_ulonglong row_count; /*记录条数*/
MYSQL_FIELD *fields; /*字段列表*/
MYSQL_DATA *data; /*当前行的数据*/
MYSQL_ROWS *data_cursor; /*下条记录*/
unsigned long *lengths; /* column lengths of current row 当前行的长度*/
MYSQL *handle; /* for unbuffered reads 待续*/
const struct st_mysql_methods *methods; /*方法*/
MYSQL_ROW row; /* If unbuffered read 下条将行缓存的行*/
MYSQL_ROW current_row; /* buffer to current row 当前行*/
MEM_ROOT field_alloc; /*内存相关 待续*/
unsigned int field_count, current_field; /*字段个数,当前字段*/
my_bool eof; /* Used by mysql_fetch_row 是否是最后一条记录*/
/* mysql_stmt_close() had to cancel this result */
my_bool unbuffered_fetch_cancelled;
void *extension;
} MYSQL_RES;
通过以上定义我们会发现其查询工作机制:查到记录条数,查到数据,效率方面,当前行业,下一行,内存相关
11。MYSQL 管理mysql_manager
typedef struct st_mysql_manager
{
NET net; /*网络通讯*/
char *host, *user, *passwd; /*连接基本信息*/
char *net_buf, *net_buf_pos, *net_data_end; /*网络操作相关*/
unsigned int port; /*端口*/
int cmd_status; /*CMD状态*/
int last_errno; /*末端错误编号*/
int net_buf_size; /*网络缓存长度*/
my_bool free_me; /*是否释放*/
my_bool eof; /*是否末尾*/
char last_error[MAX_MYSQL_MANAGER_ERR];
void *extension;
} MYSQL_MANAGER;
12.MYSQL_PARAMETERS:MYSQL参数
typedef struct st_mysql_parameters
{
unsigned long *p_max_allowed_packet;
unsigned long *p_net_buffer_length;
void *extension;
} MYSQL_PARAMETERS;
通过以上结构体的学习,我们已经对MYSQL的直接与用户打交道的部分进行了简单的了解,基本上把握其工作的内容,可以简单的初步猜测其工作原理。
通过仅仅以上学习我都感觉收益匪浅,您呢呵呵,一块进步,以上可能比较简单,没做细致分析,分析的话我想一言难尽,在接下来的视频中大家一块学习把。
MYSQL源码分析之结构体浅析
最新推荐文章于 2023-07-04 22:20:50 发布