MYSQL源码分析之结构体浅析

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的直接与用户打交道的部分进行了简单的了解,基本上把握其工作的内容,可以简单的初步猜测其工作原理。
通过仅仅以上学习我都感觉收益匪浅,您呢呵呵,一块进步,以上可能比较简单,没做细致分析,分析的话我想一言难尽,在接下来的视频中大家一块学习把。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值