MiniOB 1
MiniOB is one mini database, helping developers to learn how database works.
|
与客户端通讯 更多...
#include <mysql_communicator.h>
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 |
将处理结果返回给客户端 更多... | |
![]() | |
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 |
在任务处理完成后,通过此接口将结果返回给客户端 更多... | |
Session * | session () 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的查询 更多... | |
额外继承的成员函数 | |
![]() | |
Session * | session_ = nullptr |
struct event | read_event_ |
std::string | addr_ |
BufferedWriter * | writer_ = nullptr |
int | fd_ = -1 |
与客户端通讯
实现MySQL通讯协议 可以参考 MySQL Page Protocol 或 MariaDB Protocol
|
private |
根据实际测试,客户端在连接上来时,会发起一个 version_comment的查询
MySQL客户端连接时会发起一个"select @@version_comment"的查询,这里对这个查询进行特殊处理
这里就针对这个查询返回一个结果
[out] | need_disconnect | 连接上如果出现异常,通过这个标识来判断是否需要断开连接 |
|
overridevirtual |
有新的消息到达时,接收消息
读取客户端发过来的请求
因为MySQL协议的特殊性,收到数据后不一定需要向后流转,比如握手包
[out] | event | 如果有新的请求,就会生成一个SessionEvent |
读取一个完整的数据包
还没有做过认证,就先需要完成握手阶段
已经做过握手,接收普通的消息包
其它的非文本请求,暂时不支持
实现了 Communicator.
|
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个包,告诉客户端每个列的信息
|
private |
发送数据包到客户端
[in] | packet | 要发送的数据包 |
|
private |
返回客户端行数据
[in] | sql_result | 返回的结果 |
no_column_def | 是否没有列描述信息 | |
[out] | need_disconnect | 是否需要断开连接 |
发送每行数据 一行一个包
no_column_def | 为了特殊处理没有返回值的语句,比如insert/delete,需要做特殊处理。 这种语句只需要返回一个ok packet即可 |
|
overridevirtual |
|
private |
有些情况下不需要给客户端返回一行行的记录结果,而是返回执行是否成功即可,比如create table等
[in] | event | 处理的结果 |
[out] | need_disconnect | 是否需要断开连接 |