Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
51bb0ed6
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1187
Star
22018
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看板
提交
51bb0ed6
编写于
1月 17, 2023
作者:
wmmhello
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
opti:json non standard
上级
dbe71c3c
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
82 addition
and
10 deletion
+82
-10
source/client/src/clientSmlJson.c
source/client/src/clientSmlJson.c
+80
-8
utils/test/c/sml_test.c
utils/test/c/sml_test.c
+2
-2
未找到文件。
source/client/src/clientSmlJson.c
浏览文件 @
51bb0ed6
...
...
@@ -221,14 +221,17 @@ while(*(start)){\
//}
static
char
*
smlJsonGetObj
(
char
*
payload
){
int
leftBracketCnt
=
0
;
int
leftBracketCnt
=
0
;
bool
isInQuote
=
false
;
while
(
*
payload
)
{
if
(
unlikely
(
*
payload
==
'{'
))
{
if
(
*
payload
==
'"'
&&
*
(
payload
-
1
)
!=
'\\'
){
isInQuote
=
!
isInQuote
;
}
else
if
(
!
isInQuote
&&
unlikely
(
*
payload
==
'{'
))
{
leftBracketCnt
++
;
payload
++
;
continue
;
}
if
(
unlikely
(
*
payload
==
'}'
))
{
else
if
(
!
isInQuote
&&
unlikely
(
*
payload
==
'}'
))
{
leftBracketCnt
--
;
payload
++
;
if
(
leftBracketCnt
==
0
)
{
...
...
@@ -288,6 +291,14 @@ int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset){
JUMP_JSON_SPACE
((
*
start
))
offset
[
index
++
]
=
*
start
-
sTmp
;
element
->
timestamp
=
(
*
start
);
if
(
*
(
*
start
)
==
'{'
){
char
*
tmp
=
smlJsonGetObj
((
*
start
));
if
(
tmp
){
element
->
timestampLen
=
tmp
-
(
*
start
);
*
start
=
tmp
;
}
break
;
}
hasColon
=
true
;
continue
;
}
...
...
@@ -309,6 +320,14 @@ int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset){
JUMP_JSON_SPACE
((
*
start
))
offset
[
index
++
]
=
*
start
-
sTmp
;
element
->
cols
=
(
*
start
);
if
(
*
(
*
start
)
==
'{'
){
char
*
tmp
=
smlJsonGetObj
((
*
start
));
if
(
tmp
){
element
->
colsLen
=
tmp
-
(
*
start
);
*
start
=
tmp
;
}
break
;
}
hasColon
=
true
;
continue
;
}
...
...
@@ -381,6 +400,15 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset){
}
else
if
((
*
start
)[
1
]
==
't'
&&
(
*
start
)[
2
]
==
'i'
){
(
*
start
)
+=
offset
[
index
++
];
element
->
timestamp
=
*
start
;
if
(
*
(
*
start
)
==
'{'
){
char
*
tmp
=
smlJsonGetObj
((
*
start
));
if
(
tmp
){
element
->
timestampLen
=
tmp
-
(
*
start
);
*
start
=
tmp
;
}
continue
;
}
while
(
*
(
*
start
)){
if
(
unlikely
(
*
(
*
start
)
==
','
||
*
(
*
start
)
==
'}'
||
(
*
(
*
start
))
<=
32
)){
element
->
timestampLen
=
(
*
start
)
-
element
->
timestamp
;
...
...
@@ -391,6 +419,14 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset){
}
else
if
((
*
start
)[
1
]
==
'v'
){
(
*
start
)
+=
offset
[
index
++
];
element
->
cols
=
*
start
;
if
(
*
(
*
start
)
==
'{'
){
char
*
tmp
=
smlJsonGetObj
((
*
start
));
if
(
tmp
){
element
->
colsLen
=
tmp
-
(
*
start
);
*
start
=
tmp
;
}
continue
;
}
while
(
*
(
*
start
)){
if
(
unlikely
(
*
(
*
start
)
==
','
||
*
(
*
start
)
==
'}'
||
(
*
(
*
start
))
<=
32
)){
element
->
colsLen
=
(
*
start
)
-
element
->
cols
;
...
...
@@ -406,7 +442,7 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset){
element
->
tagsLen
=
tmp
-
(
*
start
);
*
start
=
tmp
;
}
break
;
continue
;
}
if
(
*
(
*
start
)
==
'}'
){
(
*
start
)
++
;
...
...
@@ -1111,7 +1147,24 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
}
SSmlKv
kv
=
{.
key
=
VALUE
,
.
keyLen
=
VALUE_LEN
,
.
value
=
elements
->
cols
,
.
length
=
(
size_t
)
elements
->
colsLen
};
if
(
elements
->
colsLen
==
0
||
smlParseValue
(
&
kv
,
&
info
->
msgBuf
)
!=
TSDB_CODE_SUCCESS
)
{
if
(
unlikely
(
elements
->
colsLen
==
0
))
{
uError
(
"SML:colsLen == 0"
);
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
else
if
(
unlikely
(
elements
->
cols
[
0
]
==
'{'
)){
char
tmp
=
elements
->
cols
[
elements
->
colsLen
];
elements
->
cols
[
elements
->
colsLen
]
=
'\0'
;
cJSON
*
valueJson
=
cJSON_Parse
(
elements
->
cols
);
ret
=
smlParseValueFromJSONObj
(
valueJson
,
&
kv
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
uError
(
"SML:Failed to parse value from JSON Obj:%s"
,
elements
->
cols
);
elements
->
cols
[
elements
->
colsLen
]
=
tmp
;
cJSON_Delete
(
valueJson
);
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
elements
->
cols
[
elements
->
colsLen
]
=
tmp
;
cJSON_Delete
(
valueJson
);
}
else
if
(
smlParseValue
(
&
kv
,
&
info
->
msgBuf
)
!=
TSDB_CODE_SUCCESS
){
uError
(
"SML:cols invalidate:%s"
,
elements
->
cols
);
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
...
...
@@ -1141,10 +1194,29 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
// Parse timestamp
// notice!!! put ts back to tag to ensure get meta->precision
int64_t
ts
=
smlParseOpenTsdbTime
(
info
,
elements
->
timestamp
,
elements
->
timestampLen
)
;
if
(
unlikely
(
ts
<
0
))
{
uError
(
"OTD:0x%"
PRIx64
"
Unable to parse timestamp from JSON payload
"
,
info
->
id
);
int64_t
ts
=
0
;
if
(
unlikely
(
elements
->
timestampLen
==
0
))
{
uError
(
"OTD:0x%"
PRIx64
"
elements->timestampLen == 0
"
,
info
->
id
);
return
TSDB_CODE_INVALID_TIMESTAMP
;
}
else
if
(
elements
->
timestamp
[
0
]
==
'{'
){
char
tmp
=
elements
->
timestamp
[
elements
->
timestampLen
];
elements
->
cols
[
elements
->
timestampLen
]
=
'\0'
;
cJSON
*
tsJson
=
cJSON_Parse
(
elements
->
timestamp
);
ts
=
smlParseTSFromJSON
(
info
,
tsJson
);
if
(
unlikely
(
ts
<
0
))
{
uError
(
"SML:0x%"
PRIx64
" Unable to parse timestamp from JSON payload:%s"
,
info
->
id
,
elements
->
timestamp
);
elements
->
timestamp
[
elements
->
timestampLen
]
=
tmp
;
cJSON_Delete
(
tsJson
);
return
TSDB_CODE_INVALID_TIMESTAMP
;
}
elements
->
timestamp
[
elements
->
timestampLen
]
=
tmp
;
cJSON_Delete
(
tsJson
);
}
else
{
ts
=
smlParseOpenTsdbTime
(
info
,
elements
->
timestamp
,
elements
->
timestampLen
);
if
(
unlikely
(
ts
<
0
))
{
uError
(
"OTD:0x%"
PRIx64
" Unable to parse timestamp from JSON payload"
,
info
->
id
);
return
TSDB_CODE_INVALID_TIMESTAMP
;
}
}
SSmlKv
kvTs
=
{
.
key
=
TS
,
.
keyLen
=
TS_LEN
,
.
type
=
TSDB_DATA_TYPE_TIMESTAMP
,
.
i
=
ts
,
.
length
=
(
size_t
)
tDataTypes
[
TSDB_DATA_TYPE_TIMESTAMP
].
bytes
};
...
...
utils/test/c/sml_test.c
浏览文件 @
51bb0ed6
...
...
@@ -1026,8 +1026,8 @@ int main(int argc, char *argv[]) {
}
int
ret
=
0
;
ret
=
sml_ts2385_Test
();
ASSERT
(
!
ret
);
//
ret = sml_ts2385_Test();
//
ASSERT(!ret);
// for(int i = 0; i < sizeof(str)/sizeof(str[0]); i++){
// printf("str:%s \t %d\n", str[i], smlCalTypeSum(str[i], strlen(str[i])));
// }
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录