opti:parse json
This commit is contained in:
parent
1b2a047397
commit
5ec92e7dc4
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#define JUMP_JSON_SPACE(start) \
|
#define JUMP_JSON_SPACE(start) \
|
||||||
while(*(start)){\
|
while(*(start)){\
|
||||||
if(unlikely(isspace(*(start)) == 0))\
|
if(unlikely(*(start) > 32))\
|
||||||
break;\
|
break;\
|
||||||
else\
|
else\
|
||||||
(start)++;\
|
(start)++;\
|
||||||
|
@ -34,13 +34,13 @@ static SArray *smlJsonParseTags(char *start, char *end){
|
||||||
kv.type = TSDB_DATA_TYPE_NCHAR;
|
kv.type = TSDB_DATA_TYPE_NCHAR;
|
||||||
bool isInQuote = false;
|
bool isInQuote = false;
|
||||||
while(start < end){
|
while(start < end){
|
||||||
if(!isInQuote && *start == '"'){
|
if(unlikely(!isInQuote && *start == '"')){
|
||||||
start++;
|
start++;
|
||||||
kv.key = start;
|
kv.key = start;
|
||||||
isInQuote = true;
|
isInQuote = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(isInQuote && *start == '"'){
|
if(unlikely(isInQuote && *start == '"')){
|
||||||
kv.keyLen = start - kv.key;
|
kv.keyLen = start - kv.key;
|
||||||
start++;
|
start++;
|
||||||
break;
|
break;
|
||||||
|
@ -49,18 +49,18 @@ static SArray *smlJsonParseTags(char *start, char *end){
|
||||||
}
|
}
|
||||||
bool hasColon = false;
|
bool hasColon = false;
|
||||||
while(start < end){
|
while(start < end){
|
||||||
if(!hasColon && *start == ':'){
|
if(unlikely(!hasColon && *start == ':')){
|
||||||
start++;
|
start++;
|
||||||
hasColon = true;
|
hasColon = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(hasColon && kv.value == NULL && (isspace(*start) == 0 && *start != '"')){
|
if(unlikely(hasColon && kv.value == NULL && (*start > 32 && *start != '"'))){
|
||||||
kv.value = start;
|
kv.value = start;
|
||||||
start++;
|
start++;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(hasColon && kv.value != NULL && (*start == '"' || *start == ',' || *start == '}')){
|
if(unlikely(hasColon && kv.value != NULL && (*start == '"' || *start == ',' || *start == '}'))){
|
||||||
kv.length = start - kv.value;
|
kv.length = start - kv.value;
|
||||||
taosArrayPush(tags, &kv);
|
taosArrayPush(tags, &kv);
|
||||||
start++;
|
start++;
|
||||||
|
@ -233,9 +233,13 @@ static char* smlJsonGetObj(char *payload){
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void smlJsonParseObj(char **start, SSmlLineInfo *element){
|
static inline void smlJsonParseObj(char **start, SSmlLineInfo *element){
|
||||||
while(*(*start)){
|
while(*(*start)){
|
||||||
if((*start)[0]== '"' && (*start)[1] == 'm' && (*start)[2] == 'e' && (*start)[3] == 't'
|
if((*start)[0] != '"'){
|
||||||
|
(*start)++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if((*start)[1] == 'm' && (*start)[2] == 'e' && (*start)[3] == 't'
|
||||||
&& (*start)[4] == 'r' && (*start)[5] == 'i' && (*start)[6] == 'c' && (*start)[7] == '"'){
|
&& (*start)[4] == 'r' && (*start)[5] == 'i' && (*start)[6] == 'c' && (*start)[7] == '"'){
|
||||||
|
|
||||||
(*start) += 8;
|
(*start) += 8;
|
||||||
|
@ -253,7 +257,7 @@ static void smlJsonParseObj(char **start, SSmlLineInfo *element){
|
||||||
}
|
}
|
||||||
(*start)++;
|
(*start)++;
|
||||||
}
|
}
|
||||||
}else if((*start)[0] == '"' && (*start)[1] == 't' && (*start)[2] == 'i' && (*start)[3] == 'm'
|
}else if((*start)[1] == 't' && (*start)[2] == 'i' && (*start)[3] == 'm'
|
||||||
&& (*start)[4] == 'e' && (*start)[5] == 's' && (*start)[6] == 't'
|
&& (*start)[4] == 'e' && (*start)[5] == 's' && (*start)[6] == 't'
|
||||||
&& (*start)[7] == 'a' && (*start)[8] == 'm' && (*start)[9] == 'p' && (*start)[10] == '"'){
|
&& (*start)[7] == 'a' && (*start)[8] == 'm' && (*start)[9] == 'p' && (*start)[10] == '"'){
|
||||||
|
|
||||||
|
@ -267,13 +271,13 @@ static void smlJsonParseObj(char **start, SSmlLineInfo *element){
|
||||||
hasColon = true;
|
hasColon = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(unlikely(hasColon && (*(*start) == ',' || *(*start) == '}' || isspace(*(*start)) != 0))){
|
if(unlikely(hasColon && (*(*start) == ',' || *(*start) == '}' || (*(*start)) <= 32))){
|
||||||
element->timestampLen = (*start) - element->timestamp;
|
element->timestampLen = (*start) - element->timestamp;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
(*start)++;
|
(*start)++;
|
||||||
}
|
}
|
||||||
}else if((*start)[0]== '"' && (*start)[1] == 'v' && (*start)[2] == 'a' && (*start)[3] == 'l'
|
}else if((*start)[1] == 'v' && (*start)[2] == 'a' && (*start)[3] == 'l'
|
||||||
&& (*start)[4] == 'u' && (*start)[5] == 'e' && (*start)[6] == '"'){
|
&& (*start)[4] == 'u' && (*start)[5] == 'e' && (*start)[6] == '"'){
|
||||||
|
|
||||||
(*start) += 7;
|
(*start) += 7;
|
||||||
|
@ -287,13 +291,13 @@ static void smlJsonParseObj(char **start, SSmlLineInfo *element){
|
||||||
hasColon = true;
|
hasColon = true;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if(unlikely(hasColon && (*(*start) == ',' || *(*start) == '}' || isspace(*(*start)) != 0))){
|
if(unlikely(hasColon && (*(*start) == ',' || *(*start) == '}' || (*(*start)) <= 32))){
|
||||||
element->colsLen = (*start) - element->cols;
|
element->colsLen = (*start) - element->cols;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
(*start)++;
|
(*start)++;
|
||||||
}
|
}
|
||||||
}else if((*start)[0] == '"' && (*start)[1] == 't' && (*start)[2] == 'a' && (*start)[3] == 'g'
|
}else if((*start)[1] == 't' && (*start)[2] == 'a' && (*start)[3] == 'g'
|
||||||
&& (*start)[4] == 's' && (*start)[5] == '"'){
|
&& (*start)[4] == 's' && (*start)[5] == '"'){
|
||||||
(*start) += 6;
|
(*start) += 6;
|
||||||
|
|
||||||
|
@ -326,23 +330,6 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
|
||||||
smlJsonParseObj(start, elements);
|
smlJsonParseObj(start, elements);
|
||||||
if(**start == '\0') return TSDB_CODE_SUCCESS;
|
if(**start == '\0') return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
if(unlikely(elements->measure == NULL || elements->measureLen == 0)) {
|
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid measure data", *start);
|
|
||||||
return TSDB_CODE_SML_INVALID_DATA;
|
|
||||||
}
|
|
||||||
if(unlikely(elements->tags == NULL || elements->tagsLen == 0)) {
|
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid tags data", *start);
|
|
||||||
return TSDB_CODE_SML_INVALID_DATA;
|
|
||||||
}
|
|
||||||
if(unlikely(elements->cols == NULL || elements->colsLen == 0)) {
|
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid cols data", *start);
|
|
||||||
return TSDB_CODE_SML_INVALID_DATA;
|
|
||||||
}
|
|
||||||
if(unlikely(elements->timestamp == NULL || elements->timestampLen == 0)) {
|
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid timestamp data", *start);
|
|
||||||
return TSDB_CODE_SML_INVALID_DATA;
|
|
||||||
}
|
|
||||||
|
|
||||||
SSmlKv kv = {.key = VALUE, .keyLen = VALUE_LEN, .value = elements->cols, .length = (size_t)elements->colsLen};
|
SSmlKv kv = {.key = VALUE, .keyLen = VALUE_LEN, .value = elements->cols, .length = (size_t)elements->colsLen};
|
||||||
if (smlParseNumber(&kv, &info->msgBuf)) {
|
if (smlParseNumber(&kv, &info->msgBuf)) {
|
||||||
kv.length = (int16_t)tDataTypes[kv.type].bytes;
|
kv.length = (int16_t)tDataTypes[kv.type].bytes;
|
||||||
|
@ -394,16 +381,6 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
//#define JUMP_TO_QUOTE(sql) \
|
|
||||||
// while (sql){ \
|
|
||||||
// if (unlikely(isspace(*(sql))) != 0) \
|
|
||||||
// (sql)++; \
|
|
||||||
// else \
|
|
||||||
// break; \
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
|
|
||||||
|
|
||||||
int32_t smlParseJSON(SSmlHandle *info, char *payload) {
|
int32_t smlParseJSON(SSmlHandle *info, char *payload) {
|
||||||
int32_t payloadNum = 1 << 15;
|
int32_t payloadNum = 1 << 15;
|
||||||
int32_t ret = TSDB_CODE_SUCCESS;
|
int32_t ret = TSDB_CODE_SUCCESS;
|
||||||
|
|
Loading…
Reference in New Issue