Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
fbb185a3
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1185
Star
22015
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
fbb185a3
编写于
8月 14, 2020
作者:
S
Shengliang Guan
浏览文件
操作
浏览文件
下载
差异文件
Merge remote-tracking branch 'origin/develop' into feature/os
上级
c71ab49d
93992a76
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
62 addition
and
52 deletion
+62
-52
documentation20/webdocs/markdowndocs/connector-ch.md
documentation20/webdocs/markdowndocs/connector-ch.md
+26
-26
src/client/src/tscPrepare.c
src/client/src/tscPrepare.c
+7
-5
src/client/src/tscSub.c
src/client/src/tscSub.c
+8
-6
tests/examples/c/makefile
tests/examples/c/makefile
+13
-11
tests/examples/c/prepare.c
tests/examples/c/prepare.c
+7
-3
tests/examples/c/subscribe.c
tests/examples/c/subscribe.c
+1
-1
未找到文件。
documentation20/webdocs/markdowndocs/connector-ch.md
浏览文件 @
fbb185a3
...
...
@@ -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
...
...
src/client/src/tscPrepare.c
浏览文件 @
fbb185a3
...
...
@@ -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
;
...
...
src/client/src/tscSub.c
浏览文件 @
fbb185a3
...
...
@@ -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
;
...
...
tests/examples/c/makefile
浏览文件 @
fbb185a3
...
...
@@ -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
tests/examples/c/prepare.c
浏览文件 @
fbb185a3
...
...
@@ -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
;
}
tests/examples/c/subscribe.c
浏览文件 @
fbb185a3
...
...
@@ -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
);
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录