From ed3758ece7d2a47f2d77250878c513f6a398daeb Mon Sep 17 00:00:00 2001 From: 1412 Date: Wed, 29 Jul 2020 22:05:31 +0800 Subject: [PATCH] Update tutorial-12-mysql_cli.md --- docs/tutorial-12-mysql_cli.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/tutorial-12-mysql_cli.md b/docs/tutorial-12-mysql_cli.md index 93d690b5..62990f9f 100644 --- a/docs/tutorial-12-mysql_cli.md +++ b/docs/tutorial-12-mysql_cli.md @@ -29,9 +29,9 @@ mysql://root@127.0.0.1/ mysql://:1412@test.mysql.com:3306/db1 -# 创建并启动mysql任务 +# 创建并启动MySQL任务 -用户可以使用WFTaskFactory创建mysql任务,创建接口与回调函数的用法都与workflow其他任务类似: +用户可以使用WFTaskFactory创建MySQL任务,创建接口与回调函数的用法都与workflow其他任务类似: ~~~cpp using mysql_callback_t = std::function; @@ -39,9 +39,9 @@ WFMySQLTask *create_mysql_task(const std::string& url, int retry_max, mysql_call void set_query(const std::string& query); ~~~ -用户创建完WFMySQLTask之后,可以对req调用**set_query()**写入SQL语句。 +用户创建完WFMySQLTask之后,可以对req调用 **set_query()** 写入SQL语句。 -基于mysql协议,如果建立完连接而发一个空包,server会等待而不是回包,因此用户会得到超时,因此我们对那些没有调用set_query()的task进行了特判并且会立刻返回**WFT_ERR_MYSQL_QUERY_NOT_SET**。 +基于MySQL协议,如果建立完连接而发一个空包,server会等待而不是回包,因此用户会得到超时,因此我们对那些没有调用set_query()的task进行了特判并且会立刻返回**WFT_ERR_MYSQL_QUERY_NOT_SET**。 其他包括callback、series、user_data等与workflow其他task用法类似。 @@ -66,7 +66,7 @@ int main(int argc, char *argv[]) 因为我们的交互命令中不支持选库(**USE**命令),所以,如果SQL语句中有涉及到**跨库**的操作,则可以通过**db_name.table_name**的方式指定具体哪个库的哪张表。 -**多条命令**可以拼接到一起通过set_query()传给WFMySQLTask,一般来说多条语句是可以一次把结果全部拿回来的,但由于mysql协议中回包的方式与我们一问一答的通信有某些特例下不能兼容,因此set_query()中的SQL语句有以下注意事项: +**多条命令**可以拼接到一起通过set_query()传给WFMySQLTask,一般来说多条语句是可以一次把结果全部拿回来的,但由于MySQL协议中回包的方式与我们一问一答的通信有某些特例下不能兼容,因此set_query()中的SQL语句有以下注意事项: - 可以多条单结果集语句的拼接(一般的INSERT/UPDATE/SELECT/PREPARE) @@ -92,14 +92,14 @@ req->set_query("CALL procedure1(); SELECT * FROM table1;"); 具体使用从外到内的步骤应该是: -1. 判断任务状态(代表通信层面状态):用户通过判断**task->get_state()**等于WFT_STATE_SUCCESS来查看任务执行是否成功; +1. 判断任务状态(代表通信层面状态):用户通过判断 **task->get_state()** 等于WFT_STATE_SUCCESS来查看任务执行是否成功; -2. 判断回复包类型(代表返回包解析状态):调用**resp->get_packet_type()**查看MySQL返回包类型,常见的几个类型为: +2. 判断回复包类型(代表返回包解析状态):调用 **resp->get_packet_type()** 查看MySQL返回包类型,常见的几个类型为: - MYSQL_PACKET_OK:返回非结果集的请求: 解析成功 - MYSQL_PACKET_EOF:返回结果集的请求: 解析成功 - MYSQL_PACKET_ERROR:请求:失败 -3. 判断结果集状态(代表结果集读取状态):用户可以使用cursor读取结果集中的内容,因为mysql server返回的数据是多结果集的,因此一开始cursor会**自动指向第一个结果集**的读取位置。通过**get_cursor_status()**可以拿到的几种状态: +3. 判断结果集状态(代表结果集读取状态):用户可以使用cursor读取结果集中的内容,因为MySQL server返回的数据是多结果集的,因此一开始cursor会**自动指向第一个结果集**的读取位置。通过 **get_cursor_status()** 可以拿到的几种状态: - MYSQL_STATUS_GET_RESULT:有数据可读; - MYSQL_STATUS_END:当前结果集已读完最后一行; - MYSQL_STATUS_EOF:所有结果集已取完; @@ -111,21 +111,21 @@ req->set_query("CALL procedure1(); SELECT * FROM table1;"); - const MySQLField *fetch_field(); - const MySQLField *const *fetch_fields() const; -5. 读取每一行:按行读取可以使用**fetch_row()**直到返回值为false。其中会移动cursor内部对当前结果集的指向每行的offset: +5. 读取每一行:按行读取可以使用 **fetch_row()** 直到返回值为false。其中会移动cursor内部对当前结果集的指向每行的offset: - int get_rows_count() const; - bool fetch_row(std::vector\& row_arr); - bool fetch_row(std::map\& row_map); - bool fetch_row(std::unordered_map\& row_map); - bool fetch_row_nocopy(const void **data, size_t *len, int *data_type); -6. 直接把当前结果集的所有行拿出:所有行的读取可以使用**fetch_all()**,内部用来记录行的cursor会直接移动到最后;cursor状态会变成MYSQL_STATUS_END: +6. 直接把当前结果集的所有行拿出:所有行的读取可以使用 **fetch_all()** ,内部用来记录行的cursor会直接移动到最后;cursor状态会变成MYSQL_STATUS_END: - bool fetch_all(std::vector\\>& rows); -7. 返回当前结果集的头部:如果有必要重读这个结果集,可以使用**rewind()**回到当前结果集头部,再通过第5步或第6步进行读取; +7. 返回当前结果集的头部:如果有必要重读这个结果集,可以使用 **rewind()** 回到当前结果集头部,再通过第5步或第6步进行读取; -8. 拿到下一个结果集:因为mysql server返回的数据包可能是包含多结果集的(比如每个select语句为一个结果集;或者call procedure返回的多结果集数据),因此用户可以通过**next_result_set()**跳到下一个结果集,返回值为false表示所有结果集已取完。 +8. 拿到下一个结果集:因为MySQL server返回的数据包可能是包含多结果集的(比如每个select语句为一个结果集;或者call procedure返回的多结果集数据),因此用户可以通过 **next_result_set()** 跳到下一个结果集,返回值为false表示所有结果集已取完。 -9. 返回第一个结果集:**first_result_set()**可以让我们返回到所有结果集的头部,然后可以从第3步开始重新拿数据; +9. 返回第一个结果集:**first_result_set()** 可以让我们返回到所有结果集的头部,然后可以从第3步开始重新拿数据; 10. 每列具体数据MySQLCell:第5步中读取到的一行,由多列组成,每列结果为MySQLCell,基本使用接口有: - int get_data_type(); // 返回MYSQL_TYPE_LONG、MYSQL_TYPE_STRING...具体参考[mysql_types.h.h](../src/protocol/mysql_types.h.h) @@ -223,7 +223,7 @@ begin: # WFMySQLConnection -由于我们是高并发异步客户端,这意味着我们对一个server的连接可能会不止一个。而MySQL的事务和预处理都是带状态的,为了保证一次事务或预处理独占一个连接,用户可以使用我们封装的二级工厂WFMySQLConnection来创建任务,每个WFMySQLConnection保证独占一个连接。 +由于我们是高并发异步客户端,这意味着我们对一个server的连接可能会不止一个。而MySQL的事务和预处理都是带状态的,为了保证一次事务或预处理独占一个连接,用户可以使用我们封装的二级工厂[WFMySQLConnection](../src/client/WFMySQLConnection.h)来创建任务,每个WFMySQLConnection保证独占一个连接。 ### 1. WFMySQLConnection的创建与初始化 @@ -243,11 +243,11 @@ public: ### 2. 创建任务与关闭连接 -通过**create_query_task()**,写入SQL请求和回调函数即可创建任务,该任务一定从这一个connection发出。 +通过 **create_query_task()** ,写入SQL请求和回调函数即可创建任务,该任务一定从这一个connection发出。 -有时候我们需要手动关闭这个连接。因为当我们不再使用它的时候,这个连接会一直保持到mysql server超时,期间如果使用同一个id和url去创建WFMySQLConnection的话就可能会复用到这个连接。 +有时候我们需要手动关闭这个连接。因为当我们不再使用它的时候,这个连接会一直保持到MySQL server超时,期间如果使用同一个id和url去创建WFMySQLConnection的话就可能会复用到这个连接。 -因此我们建议使用**create_disconnect_task()**创建一个任务,从而手动关闭这个连接。 +因此我们建议使用 **create_disconnect_task()** 创建一个任务,从而手动关闭这个连接。 ~~~cpp class WFMySQLConnection {