MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
载入中...
搜索中...
未找到
Public 成员函数 | Private 成员函数 | Private 属性 | 所有成员列表
MysqlCommunicator类 参考

与客户端通讯 更多...

#include <mysql_communicator.h>

类 MysqlCommunicator 继承关系图:
Communicator

Public 成员函数

virtual RC init (int fd, Session *session, const std::string &addr) override
 连接刚开始建立时,进行一些初始化 更多...
 
virtual RC read_event (SessionEvent *&event) override
 有新的消息到达时,接收消息 更多...
 
virtual RC write_result (SessionEvent *event, bool &need_disconnect) override
 将处理结果返回给客户端 更多...
 
- Public 成员函数 继承自 Communicator
virtual RC init (int fd, Session *session, const std::string &addr)
 接收到一个新的连接时,进行初始化 更多...
 
virtual RC read_event (SessionEvent *&event)=0
 监听到有新的数据到达,调用此函数进行接收消息 如果需要创建新的任务来处理,那么就创建一个SessionEvent 对象并通过event参数返回。 更多...
 
virtual RC write_result (SessionEvent *event, bool &need_disconnect)=0
 在任务处理完成后,通过此接口将结果返回给客户端 更多...
 
Sessionsession () const
 关联的会话信息
 
struct event & read_event ()
 libevent使用的数据,参考server.cpp
 
const char * addr () const
 对端地址 如果是unix socket,可能没有意义
 

Private 成员函数

RC send_packet (const BasePacket &packet)
 发送数据包到客户端 更多...
 
RC write_state (SessionEvent *event, bool &need_disconnect)
 有些情况下不需要给客户端返回一行行的记录结果,而是返回执行是否成功即可,比如create table等 更多...
 
RC send_column_definition (SqlResult *sql_result, bool &need_disconnect)
 返回客户端列描述信息 更多...
 
RC send_result_rows (SqlResult *sql_result, bool no_column_def, bool &need_disconnect)
 返回客户端行数据 更多...
 
RC handle_version_comment (bool &need_disconnect)
 根据实际测试,客户端在连接上来时,会发起一个 version_comment的查询 更多...
 

Private 属性

bool authed_ = false
 握手阶段(鉴权),需要做一些特殊处理,所以加个字段单独标记
 
uint32_t client_capabilities_flag_ = 0
 有时需要根据握手包中capabilities字段值的不同,而发送或接收不同的包
 
int8_t sequence_id_ = 0
 在一次通讯过程中(一个任务的请求与处理),每个包(packet)都有一个sequence id 这个sequence id是递增的
 

额外继承的成员函数

- Protected 属性 继承自 Communicator
Sessionsession_ = nullptr
 
struct event read_event_
 
std::string addr_
 
BufferedWriterwriter_ = nullptr
 
int fd_ = -1
 

详细描述

与客户端通讯

实现MySQL通讯协议 可以参考 MySQL Page ProtocolMariaDB Protocol

成员函数说明

◆ handle_version_comment()

RC MysqlCommunicator::handle_version_comment ( bool &  need_disconnect)
private

根据实际测试,客户端在连接上来时,会发起一个 version_comment的查询

MySQL客户端连接时会发起一个"select @@version_comment"的查询,这里对这个查询进行特殊处理

这里就针对这个查询返回一个结果

参数
[out]need_disconnect连接上如果出现异常,通过这个标识来判断是否需要断开连接

◆ read_event()

RC MysqlCommunicator::read_event ( SessionEvent *&  event)
overridevirtual

有新的消息到达时,接收消息

读取客户端发过来的请求

因为MySQL协议的特殊性,收到数据后不一定需要向后流转,比如握手包

参数
[out]event如果有新的请求,就会生成一个SessionEvent

读取一个完整的数据包

还没有做过认证,就先需要完成握手阶段

已经做过握手,接收普通的消息包

其它的非文本请求,暂时不支持

实现了 Communicator.

◆ send_column_definition()

RC MysqlCommunicator::send_column_definition ( SqlResult sql_result,
bool &  need_disconnect 
)
private

返回客户端列描述信息

根据MySQL text protocol 描述,普通的结果分为列信息描述和行数据。 这里就分为两个函数

发送列定义信息 https://dev.mysql.com/doc/dev/mysql-server/latest/page_protocol_com_query_response_text_resultset.html https://mariadb.com/kb/en/result-set-packets/#column-definition-packet

先发送当前有多少个列 然后发送N个包,告诉客户端每个列的信息

◆ send_packet()

RC MysqlCommunicator::send_packet ( const BasePacket packet)
private

发送数据包到客户端

参数
[in]packet要发送的数据包

◆ send_result_rows()

RC MysqlCommunicator::send_result_rows ( SqlResult sql_result,
bool  no_column_def,
bool &  need_disconnect 
)
private

返回客户端行数据

参数
[in]sql_result返回的结果
no_column_def是否没有列描述信息
[out]need_disconnect是否需要断开连接
返回
RC

发送每行数据 一行一个包

参数
no_column_def为了特殊处理没有返回值的语句,比如insert/delete,需要做特殊处理。 这种语句只需要返回一个ok packet即可

◆ write_result()

RC MysqlCommunicator::write_result ( SessionEvent event,
bool &  need_disconnect 
)
overridevirtual

将处理结果返回给客户端

参数
[in]event任务数据,包括处理的结果
[out]need_disconnect是否需要断开连接

实现了 Communicator.

◆ write_state()

RC MysqlCommunicator::write_state ( SessionEvent event,
bool &  need_disconnect 
)
private

有些情况下不需要给客户端返回一行行的记录结果,而是返回执行是否成功即可,比如create table等

参数
[in]event处理的结果
[out]need_disconnect是否需要断开连接

该类的文档由以下文件生成: