diff --git a/documentation20/webdocs/markdowndocs/connector-ch.md b/documentation20/webdocs/markdowndocs/connector-ch.md index c1ffa9f2ce7ff9253142fb0512517ec8429e695c..6b22004c439af7f054bf987944f0d337a9b01afc 100644 --- a/documentation20/webdocs/markdowndocs/connector-ch.md +++ b/documentation20/webdocs/markdowndocs/connector-ch.md @@ -157,25 +157,25 @@ C/C++的API类似于MySQL的C API。应用程序使用时,需要包含TDengine 异步执行SQL语句。 - * taos:调用taos_connect返回的数据库连接 - * sql:需要执行的SQL语句 - * fp:用户定义的回调函数,其第三个参数`code`用于指示操作是否成功,`0`表示成功,负数表示失败(调用`taos_errstr`获取失败原因)。应用在定义回调函数的时候,主要处理第二个参数`TAOS_RES *`,该参数是查询返回的结果集 - * param:应用提供一个用于回调的参数 + * taos:调用taos_connect返回的数据库连接 + * sql:需要执行的SQL语句 + * fp:用户定义的回调函数,其第三个参数`code`用于指示操作是否成功,`0`表示成功,负数表示失败(调用`taos_errstr`获取失败原因)。应用在定义回调函数的时候,主要处理第二个参数`TAOS_RES *`,该参数是查询返回的结果集 + * param:应用提供一个用于回调的参数 - `void taos_fetch_rows_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RES *, int numOfRows), void *param);` 批量获取异步查询的结果集,只能与`taos_query_a`配合使用。其中: - * res:`taos_query_a`回调时返回的结果集 - * fp:回调函数。其参数`param`是用户可定义的传递给回调函数的参数结构体;`numOfRows`是获取到的数据的行数(不是整个查询结果集的函数)。 在回调函数中,应用可以通过调用`taos_fetch_row`前向迭代获取批量记录中每一行记录。读完一块内的所有记录后,应用需要在回调函数中继续调用`taos_fetch_rows_a`获取下一批记录进行处理,直到返回的记录数(numOfRows)为零(结果返回完成)或记录数为负值(查询出错)。 + * res:`taos_query_a`回调时返回的结果集 + * fp:回调函数。其参数`param`是用户可定义的传递给回调函数的参数结构体;`numOfRows`是获取到的数据的行数(不是整个查询结果集的函数)。 在回调函数中,应用可以通过调用`taos_fetch_row`前向迭代获取批量记录中每一行记录。读完一块内的所有记录后,应用需要在回调函数中继续调用`taos_fetch_rows_a`获取下一批记录进行处理,直到返回的记录数(numOfRows)为零(结果返回完成)或记录数为负值(查询出错)。 - `void taos_fetch_row_a(TAOS_RES *res, void (*fp)(void *param, TAOS_RES *, TAOS_ROW row), void *param);` 异步获取一条记录。其中: - * res:`taos_query_a`回调时返回的结果集 - * fp:回调函数。其参数`param`是应用提供的一个用于回调的参数。回调时,第三个参数`row`指向一行记录。不同于`taos_fetch_rows_a`,应用无需调用`taos_fetch_row`来获取一行数据,更加简单,但数据提取性能不及批量获取的API。 + * res:`taos_query_a`回调时返回的结果集 + * fp:回调函数。其参数`param`是应用提供的一个用于回调的参数。回调时,第三个参数`row`指向一行记录。不同于`taos_fetch_rows_a`,应用无需调用`taos_fetch_row`来获取一行数据,更加简单,但数据提取性能不及批量获取的API。 TDengine的异步API均采用非阻塞调用模式。应用程序可以用多线程同时打开多张表,并可以同时对每张打开的表进行查询或者插入操作。需要指出的是,**客户端应用必须确保对同一张表的操作完全串行化**,即对同一个表的插入或查询操作未完成时(未返回时),不能够执行第二个插入或查询操作。 @@ -232,12 +232,12 @@ TDengine提供时间驱动的实时流式计算API。可以每隔一指定的时 - `TAOS_STREAM *taos_open_stream(TAOS *taos, const char *sql, void (*fp)(void *param, TAOS_RES *, TAOS_ROW row), int64_t stime, void *param, void (*callback)(void *))` 该API用来创建数据流,其中: - * taos:已经建立好的数据库连接 - * sql:SQL查询语句(仅能使用查询语句) - * fp:用户定义的回调函数指针,每次流式计算完成后,TDengine将查询的结果(TAOS_ROW)、查询状态(TAOS_RES)、用户定义参数(PARAM)传递给回调函数,在回调函数内,用户可以使用taos_num_fields获取结果集列数,taos_fetch_fields获取结果集每列数据的类型。 - * stime:是流式计算开始的时间,如果是0,表示从现在开始,如果不为零,表示从指定的时间开始计算(UTC时间从1970/1/1算起的毫秒数) - * param:是应用提供的用于回调的一个参数,回调时,提供给应用 - * callback: 第二个回调函数,会在连续查询自动停止时被调用。 + * taos:已经建立好的数据库连接 + * sql:SQL查询语句(仅能使用查询语句) + * fp:用户定义的回调函数指针,每次流式计算完成后,TDengine将查询的结果(TAOS_ROW)、查询状态(TAOS_RES)、用户定义参数(PARAM)传递给回调函数,在回调函数内,用户可以使用taos_num_fields获取结果集列数,taos_fetch_fields获取结果集每列数据的类型。 + * stime:是流式计算开始的时间,如果是0,表示从现在开始,如果不为零,表示从指定的时间开始计算(UTC时间从1970/1/1算起的毫秒数) + * param:是应用提供的用于回调的一个参数,回调时,提供给应用 + * callback: 第二个回调函数,会在连续查询自动停止时被调用。 返回值为NULL,表示创建成功,返回值不为空,表示成功。 @@ -254,21 +254,21 @@ TDengine提供时间驱动的实时流式计算API。可以每隔一指定的时 * `TAOS_SUB *taos_subscribe(TAOS* taos, int restart, const char* topic, const char *sql, TAOS_SUBSCRIBE_CALLBACK fp, void *param, int interval)` 该函数负责启动订阅服务,成功时返回订阅对象,失败时返回 `NULL`,其参数为: - * taos:已经建立好的数据库连接 - * restart:如果订阅已经存在,是重新开始,还是继续之前的订阅 - * topic:订阅的主题(即名称),此参数是订阅的唯一标识 - * sql:订阅的查询语句,此语句只能是 `select` 语句,只应查询原始数据,只能按时间正序查询数据 - * fp:收到查询结果时的回调函数(稍后介绍函数原型),只在异步调用时使用,同步调用时此参数应该传 `NULL` - * param:调用回调函数时的附加参数,系统API将其原样传递到回调函数,不进行任何处理 - * interval:轮询周期,单位为毫秒。异步调用时,将根据此参数周期性的调用回调函数,为避免对系统性能造成影响,不建议将此参数设置的过小;同步调用时,如两次调用`taos_consume`的间隔小于此周期,API将会阻塞,直到时间间隔超过此周期。 + * taos:已经建立好的数据库连接 + * restart:如果订阅已经存在,是重新开始,还是继续之前的订阅 + * topic:订阅的主题(即名称),此参数是订阅的唯一标识 + * sql:订阅的查询语句,此语句只能是 `select` 语句,只应查询原始数据,只能按时间正序查询数据 + * fp:收到查询结果时的回调函数(稍后介绍函数原型),只在异步调用时使用,同步调用时此参数应该传 `NULL` + * param:调用回调函数时的附加参数,系统API将其原样传递到回调函数,不进行任何处理 + * interval:轮询周期,单位为毫秒。异步调用时,将根据此参数周期性的调用回调函数,为避免对系统性能造成影响,不建议将此参数设置的过小;同步调用时,如两次调用`taos_consume`的间隔小于此周期,API将会阻塞,直到时间间隔超过此周期。 * `typedef void (*TAOS_SUBSCRIBE_CALLBACK)(TAOS_SUB* tsub, TAOS_RES *res, void* param, int code)` 异步模式下,回调函数的原型,其参数为: - * tsub:订阅对象 - * res:查询结果集,注意结果集中可能没有记录 - * param:调用 `taos_subscribe`时客户程序提供的附加参数 - * code:错误码 + * tsub:订阅对象 + * res:查询结果集,注意结果集中可能没有记录 + * param:调用 `taos_subscribe`时客户程序提供的附加参数 + * code:错误码 * `TAOS_RES *taos_consume(TAOS_SUB *tsub)` @@ -1025,7 +1025,7 @@ npm install td2.0-connector - Xcode - - 然后通过Xcode安装 + - 然后通过Xcode安装 ``` Command Line Tools diff --git a/src/client/src/tscPrepare.c b/src/client/src/tscPrepare.c index 0df1c7ddc514f133f8c4b53852613b8c212ecfb6..b996dd958ae432300391a104f94a4cfe27f0858d 100644 --- a/src/client/src/tscPrepare.c +++ b/src/client/src/tscPrepare.c @@ -613,11 +613,13 @@ int taos_stmt_execute(TAOS_STMT* stmt) { if (sql == NULL) { ret = TSDB_CODE_TSC_OUT_OF_MEMORY; } else { - taosTFree(pStmt->pSql->sqlstr); - pStmt->pSql->sqlstr = sql; - SSqlObj* pSql = taos_query((TAOS*)pStmt->taos, pStmt->pSql->sqlstr); - ret = taos_errno(pSql); - taos_free_result(pSql); + if (pStmt->pSql != NULL) { + taos_free_result(pStmt->pSql); + pStmt->pSql = NULL; + } + pStmt->pSql = taos_query((TAOS*)pStmt->taos, sql); + ret = taos_errno(pStmt->pSql); + free(sql); } } return ret; diff --git a/src/client/src/tscSub.c b/src/client/src/tscSub.c index 0e1be926f44c2ee302c26a6695f4b93679194430..76bce19668433d8819d44c8f272ad62b1d6dd034 100644 --- a/src/client/src/tscSub.c +++ b/src/client/src/tscSub.c @@ -405,16 +405,20 @@ TAOS_SUB *taos_subscribe(TAOS *taos, int restart, const char* topic, const char return pSub; } -void taos_free_result_imp(SSqlObj* pSql, int keepCmd); - TAOS_RES *taos_consume(TAOS_SUB *tsub) { SSub *pSub = (SSub *)tsub; if (pSub == NULL) return NULL; tscSaveSubscriptionProgress(pSub); - SSqlObj* pSql = pSub->pSql; + SSqlObj *pSql = pSub->pSql; SSqlRes *pRes = &pSql->res; + SSqlCmd *pCmd = &pSql->cmd; + STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); + SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(pCmd, 0); + if (taosArrayGetSize(pSub->progress) > 0) { // fix crash in single tabel subscription + pQueryInfo->window.skey = ((SSubscriptionProgress*)taosArrayGet(pSub->progress, 0))->key; + } if (pSub->pTimer == NULL) { int64_t duration = taosGetTimestampMs() - pSub->lastConsumeTime; @@ -436,8 +440,6 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) { tscDebug("table synchronization completed"); } - SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); - uint32_t type = pQueryInfo->type; tscFreeSqlResult(pSql); pRes->numOfRows = 1; @@ -445,7 +447,7 @@ TAOS_RES *taos_consume(TAOS_SUB *tsub) { pSql->cmd.command = TSDB_SQL_SELECT; pQueryInfo->type = type; - tscGetTableMetaInfoFromCmd(&pSql->cmd, 0, 0)->vgroupIndex = 0; + pTableMetaInfo->vgroupIndex = 0; pSql->fp = asyncCallback; pSql->fetchFp = asyncCallback; diff --git a/tests/examples/c/makefile b/tests/examples/c/makefile index f9653c9c9678f572190f2f54ac10c039e8b86a44..7293a22c11d7c6049c220ca0951b5969fa344114 100644 --- a/tests/examples/c/makefile +++ b/tests/examples/c/makefile @@ -4,22 +4,24 @@ ROOT=./ TARGET=exe LFLAGS = '-Wl,-rpath,/usr/local/taos/driver/' -ltaos -lpthread -lm -lrt -CFLAGS = -O3 -g -Wall -Wno-deprecated -fPIC -Wno-unused-result -Wconversion -Wno-char-subscripts -D_REENTRANT -Wno-format -D_REENTRANT -DLINUX -msse4.2 -Wno-unused-function -D_M_X64 \ - -I/usr/local/taos/include -std=gnu99 +CFLAGS = -O3 -g -Wall -Wno-deprecated -fPIC -Wno-unused-result -Wconversion \ + -Wno-char-subscripts -D_REENTRANT -Wno-format -D_REENTRANT -DLINUX \ + -msse4.2 -Wno-unused-function -D_M_X64 -I/usr/local/taos/include -std=gnu99 all: $(TARGET) exe: - gcc $(CFLAGS) ./asyncdemo.c -o $(ROOT)/asyncdemo $(LFLAGS) - gcc $(CFLAGS) ./demo.c -o $(ROOT)/demo $(LFLAGS) - gcc $(CFLAGS) ./prepare.c -o $(ROOT)/prepare $(LFLAGS) - gcc $(CFLAGS) ./stream.c -o $(ROOT)/stream $(LFLAGS) + gcc $(CFLAGS) ./asyncdemo.c -o $(ROOT)asyncdemo $(LFLAGS) + gcc $(CFLAGS) ./demo.c -o $(ROOT)demo $(LFLAGS) + gcc $(CFLAGS) ./prepare.c -o $(ROOT)prepare $(LFLAGS) + gcc $(CFLAGS) ./stream.c -o $(ROOT)stream $(LFLAGS) gcc $(CFLAGS) ./subscribe.c -o $(ROOT)subscribe $(LFLAGS) gcc $(CFLAGS) ./apitest.c -o $(ROOT)apitest $(LFLAGS) clean: - rm $(ROOT)/asyncdemo - rm $(ROOT)/demo - rm $(ROOT)/prepare - rm $(ROOT)/stream - rm $(ROOT)/subscribe + rm $(ROOT)asyncdemo + rm $(ROOT)demo + rm $(ROOT)prepare + rm $(ROOT)stream + rm $(ROOT)subscribe + rm $(ROOT)apitest diff --git a/tests/examples/c/prepare.c b/tests/examples/c/prepare.c index ca0942035ad9f6016993aeb4f7521a9c31dc8175..7a70b744ee8561459318aa456160a54b8c6270a8 100644 --- a/tests/examples/c/prepare.c +++ b/tests/examples/c/prepare.c @@ -195,11 +195,15 @@ int main(int argc, char *argv[]) taos_print_row(temp, row, fields, num_fields); printf("%s\n", temp); } + if (rows == 2) { + printf("two rows are fetched as expectation\n"); + } else { + printf("expect two rows, but %d rows are fetched\n", rows); + } taos_free_result(result); taos_stmt_close(stmt); - - printf("Data has been written, Please press enter to return"); - return getchar(); + + return 0; } diff --git a/tests/examples/c/subscribe.c b/tests/examples/c/subscribe.c index db5ad34ee7064978a888fc0e1cedc62aabc5a6a3..8368af18f7831d9c2cbb7402104b1c59042eda72 100644 --- a/tests/examples/c/subscribe.c +++ b/tests/examples/c/subscribe.c @@ -56,7 +56,7 @@ void check_row_count(int line, TAOS_RES* res, int expected) { void do_query(TAOS* taos, const char* sql) { - TAOS_RES* res = taos_query(taos, "drop database if exists test;"); + TAOS_RES* res = taos_query(taos, sql); taos_free_result(res); }