Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
efee9afa
T
TDengine
项目概览
taosdata
/
TDengine
大约 1 年 前同步成功
通知
1184
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看板
体验新版 GitCode,发现更多精彩内容 >>
提交
efee9afa
编写于
12月 12, 2022
作者:
wmmhello
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
opti:parse value in schemaless
上级
408ae6aa
变更
3
显示空白变更内容
内联
并排
Showing
3 changed file
with
259 addition
and
21 deletion
+259
-21
source/client/src/clientSml.c
source/client/src/clientSml.c
+175
-0
source/client/src/clientSmlLine.c
source/client/src/clientSmlLine.c
+45
-21
utils/test/c/sml_test.c
utils/test/c/sml_test.c
+39
-0
未找到文件。
source/client/src/clientSml.c
浏览文件 @
efee9afa
...
...
@@ -235,7 +235,182 @@ SSmlSTableMeta *smlBuildSTableMeta(bool isDataFormat) {
return
NULL
;
}
//uint16_t smlCalTypeSum(char* endptr, int32_t left){
// uint16_t sum = 0;
// for(int i = 0; i < left; i++){
// sum += endptr[i];
// }
// return sum;
//}
#define RETURN_FALSE \
smlBuildInvalidDataMsg(msg, "invalid data", pVal); \
return false;
#define SET_DOUBLE kvVal->type = TSDB_DATA_TYPE_DOUBLE;\
kvVal->d = result;
#define SET_FLOAT \
if (!IS_VALID_FLOAT(result)) {\
smlBuildInvalidDataMsg(msg, "float out of range[-3.402823466e+38,3.402823466e+38]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_FLOAT;\
kvVal->f = (float)result;
#define SET_BIGINT \
if (smlDoubleToInt64OverFlow(result)) {\
errno = 0;\
int64_t tmp = taosStr2Int64(pVal, &endptr, 10);\
if (errno == ERANGE) {\
smlBuildInvalidDataMsg(msg, "big int out of range[-9223372036854775808,9223372036854775807]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_BIGINT;\
kvVal->i = tmp;\
return true;\
}\
kvVal->type = TSDB_DATA_TYPE_BIGINT;\
kvVal->i = (int64_t)result;
#define SET_INT \
if (!IS_VALID_INT(result)) {\
smlBuildInvalidDataMsg(msg, "int out of range[-2147483648,2147483647]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_INT;\
kvVal->i = result;
#define SET_SMALL_INT \
if (!IS_VALID_SMALLINT(result)) {\
smlBuildInvalidDataMsg(msg, "small int our of range[-32768,32767]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_SMALLINT;\
kvVal->i = result;
#define SET_UBIGINT \
if (result >= (double)UINT64_MAX || result < 0) {\
errno = 0;\
uint64_t tmp = taosStr2UInt64(pVal, &endptr, 10);\
if (errno == ERANGE || result < 0) {\
smlBuildInvalidDataMsg(msg, "unsigned big int out of range[0,18446744073709551615]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_UBIGINT;\
kvVal->u = tmp;\
return true;\
}\
kvVal->type = TSDB_DATA_TYPE_UBIGINT;\
kvVal->u = result;
#define SET_UINT \
if (!IS_VALID_UINT(result)) {\
smlBuildInvalidDataMsg(msg, "unsigned int out of range[0,4294967295]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_UINT;\
kvVal->u = result;
#define SET_USMALL_INT \
if (!IS_VALID_USMALLINT(result)) {\
smlBuildInvalidDataMsg(msg, "unsigned small int out of rang[0,65535]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_USMALLINT;\
kvVal->u = result;
#define SET_TINYINT \
if (!IS_VALID_TINYINT(result)) { \
smlBuildInvalidDataMsg(msg, "tiny int out of range[-128,127]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_TINYINT;\
kvVal->i = result;
#define SET_UTINYINT \
if (!IS_VALID_UTINYINT(result)) {\
smlBuildInvalidDataMsg(msg, "unsigned tiny int out of range[0,255]", pVal);\
return false;\
}\
kvVal->type = TSDB_DATA_TYPE_UTINYINT;\
kvVal->u = result;
bool
smlParseNumber
(
SSmlKv
*
kvVal
,
SSmlMsgBuf
*
msg
)
{
const
char
*
pVal
=
kvVal
->
value
;
int32_t
len
=
kvVal
->
length
;
char
*
endptr
=
NULL
;
double
result
=
taosStr2Double
(
pVal
,
&
endptr
);
if
(
pVal
==
endptr
)
{
RETURN_FALSE
}
int32_t
left
=
len
-
(
endptr
-
pVal
);
if
(
left
==
0
)
{
SET_DOUBLE
}
else
if
(
left
==
3
)
{
if
(
endptr
[
0
]
==
'f'
||
endptr
[
0
]
==
'F'
){
if
(
endptr
[
1
]
==
'6'
&&
endptr
[
2
]
==
'4'
){
SET_DOUBLE
}
else
if
(
endptr
[
1
]
==
'3'
&&
endptr
[
2
]
==
'2'
){
SET_FLOAT
}
else
{
RETURN_FALSE
}
}
else
if
(
endptr
[
0
]
==
'i'
||
endptr
[
0
]
==
'I'
){
if
(
endptr
[
1
]
==
'6'
&&
endptr
[
2
]
==
'4'
){
SET_BIGINT
}
else
if
(
endptr
[
1
]
==
'3'
&&
endptr
[
2
]
==
'2'
){
SET_INT
}
else
if
(
endptr
[
1
]
==
'1'
&&
endptr
[
2
]
==
'6'
){
SET_SMALL_INT
}
else
{
RETURN_FALSE
}
}
else
if
(
endptr
[
0
]
==
'u'
||
endptr
[
0
]
==
'U'
){
if
(
endptr
[
1
]
==
'6'
&&
endptr
[
2
]
==
'4'
){
SET_UBIGINT
}
else
if
(
endptr
[
1
]
==
'3'
&&
endptr
[
2
]
==
'2'
){
SET_UINT
}
else
if
(
endptr
[
1
]
==
'1'
&&
endptr
[
2
]
==
'6'
){
SET_USMALL_INT
}
else
{
RETURN_FALSE
}
}
else
{
RETURN_FALSE
}
}
else
if
(
left
==
2
){
if
(
endptr
[
0
]
==
'i'
||
endptr
[
0
]
==
'I'
){
if
(
endptr
[
1
]
==
'8'
)
{
SET_TINYINT
}
else
{
RETURN_FALSE
}
}
else
if
(
endptr
[
0
]
==
'u'
||
endptr
[
0
]
==
'U'
)
{
if
(
endptr
[
1
]
==
'8'
)
{
SET_UTINYINT
}
else
{
RETURN_FALSE
}
}
else
{
RETURN_FALSE
}
}
else
if
(
left
==
1
){
if
(
endptr
[
0
]
==
'i'
||
endptr
[
0
]
==
'I'
){
SET_BIGINT
}
else
if
(
endptr
[
0
]
==
'u'
||
endptr
[
0
]
==
'U'
)
{
SET_UBIGINT
}
else
{
RETURN_FALSE
}
}
else
{
RETURN_FALSE
;
}
return
true
;
}
bool
smlParseNumberOld
(
SSmlKv
*
kvVal
,
SSmlMsgBuf
*
msg
)
{
const
char
*
pVal
=
kvVal
->
value
;
int32_t
len
=
kvVal
->
length
;
char
*
endptr
=
NULL
;
...
...
source/client/src/clientSmlLine.c
浏览文件 @
efee9afa
...
...
@@ -121,8 +121,8 @@ static int64_t smlParseInfluxTime(SSmlHandle *info, const char *data, int32_t le
}
static
int32_t
smlParseValue
(
SSmlKv
*
pVal
,
SSmlMsgBuf
*
msg
)
{
// binary
if
(
smlIsBinary
(
pVal
->
value
,
pVal
->
length
)
)
{
if
(
pVal
->
value
[
0
]
==
'"'
){
// binary
if
(
pVal
->
length
>=
2
&&
pVal
->
value
[
pVal
->
length
-
1
]
==
'"'
)
{
pVal
->
type
=
TSDB_DATA_TYPE_BINARY
;
pVal
->
length
-=
BINARY_ADD_LEN
;
if
(
pVal
->
length
>
TSDB_MAX_BINARY_LEN
-
VARSTR_HEADER_SIZE
)
{
...
...
@@ -131,8 +131,11 @@ static int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) {
pVal
->
value
+=
(
BINARY_ADD_LEN
-
1
);
return
TSDB_CODE_SUCCESS
;
}
// nchar
if
(
smlIsNchar
(
pVal
->
value
,
pVal
->
length
))
{
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
if
(
pVal
->
value
[
0
]
==
'l'
||
pVal
->
value
[
0
]
==
'L'
){
// nchar
if
(
pVal
->
value
[
1
]
==
'"'
&&
pVal
->
value
[
pVal
->
length
-
1
]
==
'"'
&&
pVal
->
length
>=
3
){
pVal
->
type
=
TSDB_DATA_TYPE_NCHAR
;
pVal
->
length
-=
NCHAR_ADD_LEN
;
if
(
pVal
->
length
>
(
TSDB_MAX_NCHAR_LEN
-
VARSTR_HEADER_SIZE
)
/
TSDB_NCHAR_SIZE
)
{
...
...
@@ -141,13 +144,34 @@ static int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) {
pVal
->
value
+=
(
NCHAR_ADD_LEN
-
1
);
return
TSDB_CODE_SUCCESS
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
// bool
if
(
smlParseBool
(
pVal
))
{
if
(
pVal
->
value
[
0
]
==
't'
||
pVal
->
value
[
0
]
==
'T'
){
if
(
pVal
->
length
==
1
||
(
pVal
->
length
==
4
&&
(
pVal
->
value
[
1
]
==
'u'
||
pVal
->
value
[
1
]
==
'U'
)
&&
(
pVal
->
value
[
2
]
==
'r'
||
pVal
->
value
[
2
]
==
'R'
)
&&
(
pVal
->
value
[
3
]
==
'e'
||
pVal
->
value
[
3
]
==
'E'
))){
pVal
->
i
=
TSDB_TRUE
;
pVal
->
type
=
TSDB_DATA_TYPE_BOOL
;
pVal
->
length
=
(
int16_t
)
tDataTypes
[
pVal
->
type
].
bytes
;
return
TSDB_CODE_SUCCESS
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
if
(
pVal
->
value
[
0
]
==
'f'
||
pVal
->
value
[
0
]
==
'F'
){
if
(
pVal
->
length
==
1
||
(
pVal
->
length
==
5
&&
(
pVal
->
value
[
1
]
==
'a'
||
pVal
->
value
[
1
]
==
'A'
)
&&
(
pVal
->
value
[
2
]
==
'l'
||
pVal
->
value
[
2
]
==
'L'
)
&&
(
pVal
->
value
[
3
]
==
's'
||
pVal
->
value
[
3
]
==
'S'
)
&&
(
pVal
->
value
[
4
]
==
'e'
||
pVal
->
value
[
4
]
==
'E'
))){
pVal
->
i
=
TSDB_FALSE
;
pVal
->
type
=
TSDB_DATA_TYPE_BOOL
;
pVal
->
length
=
(
int16_t
)
tDataTypes
[
pVal
->
type
].
bytes
;
return
TSDB_CODE_SUCCESS
;
}
return
TSDB_CODE_TSC_INVALID_VALUE
;
}
// number
if
(
smlParseNumber
(
pVal
,
msg
))
{
pVal
->
length
=
(
int16_t
)
tDataTypes
[
pVal
->
type
].
bytes
;
...
...
utils/test/c/sml_test.c
浏览文件 @
efee9afa
...
...
@@ -1159,7 +1159,46 @@ int sml_ttl_Test() {
return
code
;
}
//char *str[] ={
// "",
// "f64",
// "F64",
// "f32",
// "F32",
// "i",
// "I",
// "i64",
// "I64",
// "u",
// "U",
// "u64",
// "U64",
// "i32",
// "I32",
// "u32",
// "U32",
// "i16",
// "I16",
// "u16",
// "U16",
// "i8",
// "I8",
// "u8",
// "U8",
//};
//uint8_t smlCalTypeSum(char* endptr, int32_t left){
// uint8_t sum = 0;
// for(int i = 0; i < left; i++){
// sum += endptr[i];
// }
// return sum;
//}
int
main
(
int
argc
,
char
*
argv
[])
{
// 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])));
// }
int
ret
=
0
;
ret
=
sml_ttl_Test
();
ASSERT
(
!
ret
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录