fix:json parse error
This commit is contained in:
parent
a0d46fe9f4
commit
5290c32fd1
|
@ -181,6 +181,7 @@ typedef struct {
|
|||
cJSON *root; // for parse json
|
||||
int8_t offset[OTD_JSON_FIELDS_NUM];
|
||||
SSmlLineInfo *lines; // element is SSmlLineInfo
|
||||
bool parseJsonByLib;
|
||||
|
||||
//
|
||||
SArray *preLineTagKV;
|
||||
|
@ -209,7 +210,7 @@ SSmlHandle *smlBuildSmlInfo(TAOS *taos);
|
|||
void smlDestroyInfo(SSmlHandle *info);
|
||||
int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset);
|
||||
int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset);
|
||||
SArray *smlJsonParseTags(char *start, char *end);
|
||||
//SArray *smlJsonParseTags(char *start, char *end);
|
||||
bool smlParseNumberOld(SSmlKv *kvVal, SSmlMsgBuf *msg);
|
||||
void* nodeListGet(NodeList* list, const void *key, int32_t len, _equal_fn_sml fn);
|
||||
int nodeListSet(NodeList** list, const void *key, int32_t len, void* value, _equal_fn_sml fn);
|
||||
|
|
|
@ -1008,12 +1008,16 @@ static int32_t smlUpdateMeta(SHashObj *metaHash, SArray *metaArray, SArray *cols
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static void smlDestroyTableInfo(SSmlTableInfo *tag) {
|
||||
static void smlDestroyTableInfo(SSmlHandle *info, SSmlTableInfo *tag) {
|
||||
for (size_t i = 0; i < taosArrayGetSize(tag->cols); i++) {
|
||||
SHashObj *kvHash = (SHashObj *)taosArrayGetP(tag->cols, i);
|
||||
taosHashCleanup(kvHash);
|
||||
}
|
||||
|
||||
if(info->parseJsonByLib){
|
||||
SSmlLineInfo *key = (SSmlLineInfo *)(tag->key);
|
||||
if(key != NULL) taosMemoryFree(key->tags);
|
||||
}
|
||||
taosMemoryFree(tag->key);
|
||||
taosArrayDestroy(tag->cols);
|
||||
taosArrayDestroy(tag->tags);
|
||||
|
@ -1028,7 +1032,7 @@ void smlDestroyInfo(SSmlHandle *info) {
|
|||
NodeList *tmp = info->childTables;
|
||||
while (tmp) {
|
||||
if (tmp->data.used) {
|
||||
smlDestroyTableInfo((SSmlTableInfo *)tmp->data.value);
|
||||
smlDestroyTableInfo(info, (SSmlTableInfo *)tmp->data.value);
|
||||
}
|
||||
NodeList *t = tmp->next;
|
||||
taosMemoryFree(tmp);
|
||||
|
@ -1055,6 +1059,9 @@ void smlDestroyInfo(SSmlHandle *info) {
|
|||
if (!info->dataFormat) {
|
||||
for (int i = 0; i < info->lineNum; i++) {
|
||||
taosArrayDestroy(info->lines[i].colArray);
|
||||
if(info->parseJsonByLib){
|
||||
taosMemoryFree(info->lines[i].tags);
|
||||
}
|
||||
}
|
||||
taosMemoryFree(info->lines);
|
||||
}
|
||||
|
@ -1251,7 +1258,7 @@ int32_t smlClearForRerun(SSmlHandle *info) {
|
|||
NodeList *pList = info->childTables;
|
||||
while (pList) {
|
||||
if (pList->data.used) {
|
||||
smlDestroyTableInfo((SSmlTableInfo *)pList->data.value);
|
||||
smlDestroyTableInfo(info, (SSmlTableInfo *)pList->data.value);
|
||||
pList->data.used = false;
|
||||
}
|
||||
pList = pList->next;
|
||||
|
|
|
@ -29,193 +29,193 @@ while(*(start)){\
|
|||
(start)++;\
|
||||
}
|
||||
|
||||
SArray *smlJsonParseTags(char *start, char *end){
|
||||
SArray *tags = taosArrayInit(4, sizeof(SSmlKv));
|
||||
while(start < end){
|
||||
SSmlKv kv = {0};
|
||||
kv.type = TSDB_DATA_TYPE_NCHAR;
|
||||
bool isInQuote = false;
|
||||
while(start < end){
|
||||
if(unlikely(!isInQuote && *start == '"')){
|
||||
start++;
|
||||
kv.key = start;
|
||||
isInQuote = true;
|
||||
continue;
|
||||
}
|
||||
if(unlikely(isInQuote && *start == '"')){
|
||||
kv.keyLen = start - kv.key;
|
||||
start++;
|
||||
break;
|
||||
}
|
||||
start++;
|
||||
}
|
||||
bool hasColon = false;
|
||||
while(start < end){
|
||||
if(unlikely(!hasColon && *start == ':')){
|
||||
start++;
|
||||
hasColon = true;
|
||||
continue;
|
||||
}
|
||||
if(unlikely(hasColon && kv.value == NULL && (*start > 32 && *start != '"'))){
|
||||
kv.value = start;
|
||||
start++;
|
||||
continue;
|
||||
}
|
||||
//SArray *smlJsonParseTags(char *start, char *end){
|
||||
// SArray *tags = taosArrayInit(4, sizeof(SSmlKv));
|
||||
// while(start < end){
|
||||
// SSmlKv kv = {0};
|
||||
// kv.type = TSDB_DATA_TYPE_NCHAR;
|
||||
// bool isInQuote = false;
|
||||
// while(start < end){
|
||||
// if(unlikely(!isInQuote && *start == '"')){
|
||||
// start++;
|
||||
// kv.key = start;
|
||||
// isInQuote = true;
|
||||
// continue;
|
||||
// }
|
||||
// if(unlikely(isInQuote && *start == '"')){
|
||||
// kv.keyLen = start - kv.key;
|
||||
// start++;
|
||||
// break;
|
||||
// }
|
||||
// start++;
|
||||
// }
|
||||
// bool hasColon = false;
|
||||
// while(start < end){
|
||||
// if(unlikely(!hasColon && *start == ':')){
|
||||
// start++;
|
||||
// hasColon = true;
|
||||
// continue;
|
||||
// }
|
||||
// if(unlikely(hasColon && kv.value == NULL && (*start > 32 && *start != '"'))){
|
||||
// kv.value = start;
|
||||
// start++;
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
// if(unlikely(hasColon && kv.value != NULL && (*start == '"' || *start == ',' || *start == '}'))){
|
||||
// kv.length = start - kv.value;
|
||||
// taosArrayPush(tags, &kv);
|
||||
// start++;
|
||||
// break;
|
||||
// }
|
||||
// start++;
|
||||
// }
|
||||
// }
|
||||
// return tags;
|
||||
//}
|
||||
|
||||
if(unlikely(hasColon && kv.value != NULL && (*start == '"' || *start == ',' || *start == '}'))){
|
||||
kv.length = start - kv.value;
|
||||
taosArrayPush(tags, &kv);
|
||||
start++;
|
||||
break;
|
||||
}
|
||||
start++;
|
||||
}
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
static int32_t smlParseTagsFromJSON(SSmlHandle *info, SSmlLineInfo *elements) {
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
||||
if(is_same_child_table_telnet(elements, &info->preLine) == 0){
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
bool isSameMeasure = IS_SAME_SUPER_TABLE;
|
||||
|
||||
int cnt = 0;
|
||||
SArray *preLineKV = info->preLineTagKV;
|
||||
bool isSuperKVInit = true;
|
||||
SArray *superKV = NULL;
|
||||
if(info->dataFormat){
|
||||
if(unlikely(!isSameMeasure)){
|
||||
SSmlSTableMeta *sMeta = (SSmlSTableMeta *)nodeListGet(info->superTables, elements->measure, elements->measureLen, NULL);
|
||||
|
||||
if(unlikely(sMeta == NULL)){
|
||||
sMeta = smlBuildSTableMeta(info->dataFormat);
|
||||
STableMeta * pTableMeta = smlGetMeta(info, elements->measure, elements->measureLen);
|
||||
sMeta->tableMeta = pTableMeta;
|
||||
if(pTableMeta == NULL){
|
||||
info->dataFormat = false;
|
||||
info->reRun = true;
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
nodeListSet(&info->superTables, elements->measure, elements->measureLen, sMeta, NULL);
|
||||
}
|
||||
info->currSTableMeta = sMeta->tableMeta;
|
||||
superKV = sMeta->tags;
|
||||
|
||||
if(unlikely(taosArrayGetSize(superKV) == 0)){
|
||||
isSuperKVInit = false;
|
||||
}
|
||||
taosArraySetSize(preLineKV, 0);
|
||||
}
|
||||
}else{
|
||||
taosArraySetSize(preLineKV, 0);
|
||||
}
|
||||
|
||||
SArray *tags = smlJsonParseTags(elements->tags, elements->tags + elements->tagsLen);
|
||||
int32_t tagNum = taosArrayGetSize(tags);
|
||||
if (tagNum == 0) {
|
||||
uError("SML:tag is empty:%s", elements->tags)
|
||||
taosArrayDestroy(tags);
|
||||
return TSDB_CODE_SML_INVALID_DATA;
|
||||
}
|
||||
for (int32_t i = 0; i < tagNum; ++i) {
|
||||
SSmlKv kv = *(SSmlKv*)taosArrayGet(tags, i);
|
||||
|
||||
if(info->dataFormat){
|
||||
if(unlikely(cnt + 1 > info->currSTableMeta->tableInfo.numOfTags)){
|
||||
info->dataFormat = false;
|
||||
info->reRun = true;
|
||||
taosArrayDestroy(tags);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
if(isSameMeasure){
|
||||
if(unlikely(cnt >= taosArrayGetSize(preLineKV))) {
|
||||
info->dataFormat = false;
|
||||
info->reRun = true;
|
||||
taosArrayDestroy(tags);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
SSmlKv *preKV = (SSmlKv *)taosArrayGet(preLineKV, cnt);
|
||||
if(unlikely(kv.length > preKV->length)){
|
||||
preKV->length = kv.length;
|
||||
SSmlSTableMeta *tableMeta = (SSmlSTableMeta *)nodeListGet(info->superTables, elements->measure, elements->measureLen, NULL);
|
||||
ASSERT(tableMeta != NULL);
|
||||
|
||||
SSmlKv *oldKV = (SSmlKv *)taosArrayGet(tableMeta->tags, cnt);
|
||||
oldKV->length = kv.length;
|
||||
info->needModifySchema = true;
|
||||
}
|
||||
if(unlikely(!IS_SAME_KEY)){
|
||||
info->dataFormat = false;
|
||||
info->reRun = true;
|
||||
taosArrayDestroy(tags);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
}else{
|
||||
if(isSuperKVInit){
|
||||
if(unlikely(cnt >= taosArrayGetSize(superKV))) {
|
||||
info->dataFormat = false;
|
||||
info->reRun = true;
|
||||
taosArrayDestroy(tags);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
SSmlKv *preKV = (SSmlKv *)taosArrayGet(superKV, cnt);
|
||||
if(unlikely(kv.length > preKV->length)) {
|
||||
preKV->length = kv.length;
|
||||
}else{
|
||||
kv.length = preKV->length;
|
||||
}
|
||||
info->needModifySchema = true;
|
||||
|
||||
if(unlikely(!IS_SAME_KEY)){
|
||||
info->dataFormat = false;
|
||||
info->reRun = true;
|
||||
taosArrayDestroy(tags);
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
}else{
|
||||
taosArrayPush(superKV, &kv);
|
||||
}
|
||||
taosArrayPush(preLineKV, &kv);
|
||||
}
|
||||
}else{
|
||||
taosArrayPush(preLineKV, &kv);
|
||||
}
|
||||
cnt++;
|
||||
}
|
||||
taosArrayDestroy(tags);
|
||||
|
||||
SSmlTableInfo *tinfo = (SSmlTableInfo *)nodeListGet(info->childTables, elements, POINTER_BYTES, is_same_child_table_telnet);
|
||||
if (unlikely(tinfo == NULL)) {
|
||||
tinfo = smlBuildTableInfo(1, elements->measure, elements->measureLen);
|
||||
if (unlikely(!tinfo)) {
|
||||
return TSDB_CODE_OUT_OF_MEMORY;
|
||||
}
|
||||
tinfo->tags = taosArrayDup(preLineKV, NULL);
|
||||
|
||||
smlSetCTableName(tinfo);
|
||||
if (info->dataFormat) {
|
||||
info->currSTableMeta->uid = tinfo->uid;
|
||||
tinfo->tableDataCtx = smlInitTableDataCtx(info->pQuery, info->currSTableMeta);
|
||||
if (tinfo->tableDataCtx == NULL) {
|
||||
smlBuildInvalidDataMsg(&info->msgBuf, "smlInitTableDataCtx error", NULL);
|
||||
return TSDB_CODE_SML_INVALID_DATA;
|
||||
}
|
||||
}
|
||||
|
||||
SSmlLineInfo *key = (SSmlLineInfo *)taosMemoryMalloc(sizeof(SSmlLineInfo));
|
||||
*key = *elements;
|
||||
tinfo->key = key;
|
||||
nodeListSet(&info->childTables, key, POINTER_BYTES, tinfo, is_same_child_table_telnet);
|
||||
}
|
||||
if (info->dataFormat) info->currTableDataCtx = tinfo->tableDataCtx;
|
||||
|
||||
return ret;
|
||||
}
|
||||
//static int32_t smlParseTagsFromJSON(SSmlHandle *info, SSmlLineInfo *elements) {
|
||||
// int32_t ret = TSDB_CODE_SUCCESS;
|
||||
//
|
||||
// if(is_same_child_table_telnet(elements, &info->preLine) == 0){
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
//
|
||||
// bool isSameMeasure = IS_SAME_SUPER_TABLE;
|
||||
//
|
||||
// int cnt = 0;
|
||||
// SArray *preLineKV = info->preLineTagKV;
|
||||
// bool isSuperKVInit = true;
|
||||
// SArray *superKV = NULL;
|
||||
// if(info->dataFormat){
|
||||
// if(unlikely(!isSameMeasure)){
|
||||
// SSmlSTableMeta *sMeta = (SSmlSTableMeta *)nodeListGet(info->superTables, elements->measure, elements->measureLen, NULL);
|
||||
//
|
||||
// if(unlikely(sMeta == NULL)){
|
||||
// sMeta = smlBuildSTableMeta(info->dataFormat);
|
||||
// STableMeta * pTableMeta = smlGetMeta(info, elements->measure, elements->measureLen);
|
||||
// sMeta->tableMeta = pTableMeta;
|
||||
// if(pTableMeta == NULL){
|
||||
// info->dataFormat = false;
|
||||
// info->reRun = true;
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
// nodeListSet(&info->superTables, elements->measure, elements->measureLen, sMeta, NULL);
|
||||
// }
|
||||
// info->currSTableMeta = sMeta->tableMeta;
|
||||
// superKV = sMeta->tags;
|
||||
//
|
||||
// if(unlikely(taosArrayGetSize(superKV) == 0)){
|
||||
// isSuperKVInit = false;
|
||||
// }
|
||||
// taosArraySetSize(preLineKV, 0);
|
||||
// }
|
||||
// }else{
|
||||
// taosArraySetSize(preLineKV, 0);
|
||||
// }
|
||||
//
|
||||
// SArray *tags = smlJsonParseTags(elements->tags, elements->tags + elements->tagsLen);
|
||||
// int32_t tagNum = taosArrayGetSize(tags);
|
||||
// if (tagNum == 0) {
|
||||
// uError("SML:tag is empty:%s", elements->tags)
|
||||
// taosArrayDestroy(tags);
|
||||
// return TSDB_CODE_SML_INVALID_DATA;
|
||||
// }
|
||||
// for (int32_t i = 0; i < tagNum; ++i) {
|
||||
// SSmlKv kv = *(SSmlKv*)taosArrayGet(tags, i);
|
||||
//
|
||||
// if(info->dataFormat){
|
||||
// if(unlikely(cnt + 1 > info->currSTableMeta->tableInfo.numOfTags)){
|
||||
// info->dataFormat = false;
|
||||
// info->reRun = true;
|
||||
// taosArrayDestroy(tags);
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
//
|
||||
// if(isSameMeasure){
|
||||
// if(unlikely(cnt >= taosArrayGetSize(preLineKV))) {
|
||||
// info->dataFormat = false;
|
||||
// info->reRun = true;
|
||||
// taosArrayDestroy(tags);
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
// SSmlKv *preKV = (SSmlKv *)taosArrayGet(preLineKV, cnt);
|
||||
// if(unlikely(kv.length > preKV->length)){
|
||||
// preKV->length = kv.length;
|
||||
// SSmlSTableMeta *tableMeta = (SSmlSTableMeta *)nodeListGet(info->superTables, elements->measure, elements->measureLen, NULL);
|
||||
// ASSERT(tableMeta != NULL);
|
||||
//
|
||||
// SSmlKv *oldKV = (SSmlKv *)taosArrayGet(tableMeta->tags, cnt);
|
||||
// oldKV->length = kv.length;
|
||||
// info->needModifySchema = true;
|
||||
// }
|
||||
// if(unlikely(!IS_SAME_KEY)){
|
||||
// info->dataFormat = false;
|
||||
// info->reRun = true;
|
||||
// taosArrayDestroy(tags);
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
// }else{
|
||||
// if(isSuperKVInit){
|
||||
// if(unlikely(cnt >= taosArrayGetSize(superKV))) {
|
||||
// info->dataFormat = false;
|
||||
// info->reRun = true;
|
||||
// taosArrayDestroy(tags);
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
// SSmlKv *preKV = (SSmlKv *)taosArrayGet(superKV, cnt);
|
||||
// if(unlikely(kv.length > preKV->length)) {
|
||||
// preKV->length = kv.length;
|
||||
// }else{
|
||||
// kv.length = preKV->length;
|
||||
// }
|
||||
// info->needModifySchema = true;
|
||||
//
|
||||
// if(unlikely(!IS_SAME_KEY)){
|
||||
// info->dataFormat = false;
|
||||
// info->reRun = true;
|
||||
// taosArrayDestroy(tags);
|
||||
// return TSDB_CODE_SUCCESS;
|
||||
// }
|
||||
// }else{
|
||||
// taosArrayPush(superKV, &kv);
|
||||
// }
|
||||
// taosArrayPush(preLineKV, &kv);
|
||||
// }
|
||||
// }else{
|
||||
// taosArrayPush(preLineKV, &kv);
|
||||
// }
|
||||
// cnt++;
|
||||
// }
|
||||
// taosArrayDestroy(tags);
|
||||
//
|
||||
// SSmlTableInfo *tinfo = (SSmlTableInfo *)nodeListGet(info->childTables, elements, POINTER_BYTES, is_same_child_table_telnet);
|
||||
// if (unlikely(tinfo == NULL)) {
|
||||
// tinfo = smlBuildTableInfo(1, elements->measure, elements->measureLen);
|
||||
// if (unlikely(!tinfo)) {
|
||||
// return TSDB_CODE_OUT_OF_MEMORY;
|
||||
// }
|
||||
// tinfo->tags = taosArrayDup(preLineKV, NULL);
|
||||
//
|
||||
// smlSetCTableName(tinfo);
|
||||
// if (info->dataFormat) {
|
||||
// info->currSTableMeta->uid = tinfo->uid;
|
||||
// tinfo->tableDataCtx = smlInitTableDataCtx(info->pQuery, info->currSTableMeta);
|
||||
// if (tinfo->tableDataCtx == NULL) {
|
||||
// smlBuildInvalidDataMsg(&info->msgBuf, "smlInitTableDataCtx error", NULL);
|
||||
// return TSDB_CODE_SML_INVALID_DATA;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// SSmlLineInfo *key = (SSmlLineInfo *)taosMemoryMalloc(sizeof(SSmlLineInfo));
|
||||
// *key = *elements;
|
||||
// tinfo->key = key;
|
||||
// nodeListSet(&info->childTables, key, POINTER_BYTES, tinfo, is_same_child_table_telnet);
|
||||
// }
|
||||
// if (info->dataFormat) info->currTableDataCtx = tinfo->tableDataCtx;
|
||||
//
|
||||
// return ret;
|
||||
//}
|
||||
|
||||
static char* smlJsonGetObj(char *payload){
|
||||
int leftBracketCnt = 0;
|
||||
|
@ -416,72 +416,6 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset){
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *elements) {
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
||||
if(info->offset[0] == 0){
|
||||
ret = smlJsonParseObjFirst(start, elements, info->offset);
|
||||
}else{
|
||||
ret = smlJsonParseObj(start, elements, info->offset);
|
||||
}
|
||||
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if(unlikely(**start == '\0' && elements->measure == NULL)) return TSDB_CODE_SUCCESS;
|
||||
|
||||
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) {
|
||||
uError("SML:cols invalidate:%s", elements->cols);
|
||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||
}
|
||||
|
||||
|
||||
// Parse tags
|
||||
ret = smlParseTagsFromJSON(info, elements);
|
||||
if (unlikely(ret)) {
|
||||
uError("OTD:0x%" PRIx64 " Unable to parse tags from JSON payload", info->id);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if(unlikely(info->reRun)){
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
// 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);
|
||||
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};
|
||||
|
||||
if(info->dataFormat){
|
||||
ret = smlBuildCol(info->currTableDataCtx, info->currSTableMeta->schema, &kvTs, 0);
|
||||
if(ret == TSDB_CODE_SUCCESS){
|
||||
ret = smlBuildCol(info->currTableDataCtx, info->currSTableMeta->schema, &kv, 1);
|
||||
}
|
||||
if(ret == TSDB_CODE_SUCCESS){
|
||||
ret = smlBuildRow(info->currTableDataCtx);
|
||||
}
|
||||
if (unlikely(ret != TSDB_CODE_SUCCESS)) {
|
||||
smlBuildInvalidDataMsg(&info->msgBuf, "smlBuildCol error", NULL);
|
||||
return ret;
|
||||
}
|
||||
}else{
|
||||
if(elements->colArray == NULL){
|
||||
elements->colArray = taosArrayInit(16, sizeof(SSmlKv));
|
||||
}
|
||||
taosArrayPush(elements->colArray, &kvTs);
|
||||
taosArrayPush(elements->colArray, &kv);
|
||||
}
|
||||
info->preLine = *elements;
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static inline int32_t smlParseMetricFromJSON(SSmlHandle *info, cJSON *metric, SSmlLineInfo *elements) {
|
||||
elements->measureLen = strlen(metric->valuestring);
|
||||
if (IS_INVALID_TABLE_LEN(elements->measureLen)) {
|
||||
|
@ -707,15 +641,9 @@ static int32_t smlParseValueFromJSON(cJSON *root, SSmlKv *kv) {
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static int32_t smlParseTagsFromJSONExt(SSmlHandle *info, cJSON *tags, SSmlLineInfo *elements) {
|
||||
static int32_t smlParseTagsFromJSON(SSmlHandle *info, cJSON *tags, SSmlLineInfo *elements) {
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
||||
elements->tags = cJSON_PrintUnformatted(tags);
|
||||
elements->tagsLen = strlen(elements->tags);
|
||||
if(is_same_child_table_telnet(elements, &info->preLine) == 0){
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
bool isSameMeasure = IS_SAME_SUPER_TABLE;
|
||||
|
||||
int cnt = 0;
|
||||
|
@ -853,6 +781,11 @@ static int32_t smlParseTagsFromJSONExt(SSmlHandle *info, cJSON *tags, SSmlLineIn
|
|||
|
||||
SSmlLineInfo *key = (SSmlLineInfo *)taosMemoryMalloc(sizeof(SSmlLineInfo));
|
||||
*key = *elements;
|
||||
if(info->parseJsonByLib){
|
||||
key->tags = taosMemoryMalloc(elements->tagsLen + 1);
|
||||
memcpy(key->tags, elements->tags, elements->tagsLen);
|
||||
key->tags[elements->tagsLen] = 0;
|
||||
}
|
||||
tinfo->key = key;
|
||||
nodeListSet(&info->childTables, key, POINTER_BYTES, tinfo, is_same_child_table_telnet);
|
||||
}
|
||||
|
@ -1018,11 +951,20 @@ static int32_t smlParseJSONStringExt(SSmlHandle *info, cJSON *root, SSmlLineInfo
|
|||
}
|
||||
|
||||
// Parse tags
|
||||
ret = smlParseTagsFromJSONExt(info, tagsJson, elements);
|
||||
elements->tags = cJSON_PrintUnformatted(tagsJson);
|
||||
elements->tagsLen = strlen(elements->tags);
|
||||
if(is_same_child_table_telnet(elements, &info->preLine) != 0) {
|
||||
ret = smlParseTagsFromJSON(info, tagsJson, elements);
|
||||
if (unlikely(ret)) {
|
||||
uError("OTD:0x%" PRIx64 " Unable to parse tags from JSON payload", info->id);
|
||||
taosMemoryFree(elements->tags);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if(info->dataFormat){
|
||||
taosMemoryFree(elements->tags);
|
||||
}
|
||||
|
||||
if(unlikely(info->reRun)){
|
||||
return TSDB_CODE_SUCCESS;
|
||||
|
@ -1129,6 +1071,83 @@ static int32_t smlParseJSONExt(SSmlHandle *info, char *payload) {
|
|||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *elements) {
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
||||
if(info->offset[0] == 0){
|
||||
ret = smlJsonParseObjFirst(start, elements, info->offset);
|
||||
}else{
|
||||
ret = smlJsonParseObj(start, elements, info->offset);
|
||||
}
|
||||
|
||||
if (ret != TSDB_CODE_SUCCESS) {
|
||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||
}
|
||||
|
||||
if(unlikely(**start == '\0' && elements->measure == NULL)) return TSDB_CODE_SUCCESS;
|
||||
|
||||
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) {
|
||||
uError("SML:cols invalidate:%s", elements->cols);
|
||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||
}
|
||||
|
||||
// Parse tags
|
||||
if(is_same_child_table_telnet(elements, &info->preLine) != 0){
|
||||
char tmp = *(elements->tags + elements->tagsLen);
|
||||
*(elements->tags + elements->tagsLen) = 0;
|
||||
cJSON* tagsJson = cJSON_Parse(elements->tags);
|
||||
*(elements->tags + elements->tagsLen) = tmp;
|
||||
if (unlikely(tagsJson == NULL)) {
|
||||
uError("SML:0x%" PRIx64 " parse json failed:%s", info->id, elements->tags);
|
||||
return TSDB_CODE_TSC_INVALID_JSON;
|
||||
}
|
||||
|
||||
ret = smlParseTagsFromJSON(info, tagsJson, elements);
|
||||
cJSON_free(tagsJson);
|
||||
if (unlikely(ret)) {
|
||||
uError("OTD:0x%" PRIx64 " Unable to parse tags from JSON payload", info->id);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
if(unlikely(info->reRun)){
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
// 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);
|
||||
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};
|
||||
|
||||
if(info->dataFormat){
|
||||
ret = smlBuildCol(info->currTableDataCtx, info->currSTableMeta->schema, &kvTs, 0);
|
||||
if(ret == TSDB_CODE_SUCCESS){
|
||||
ret = smlBuildCol(info->currTableDataCtx, info->currSTableMeta->schema, &kv, 1);
|
||||
}
|
||||
if(ret == TSDB_CODE_SUCCESS){
|
||||
ret = smlBuildRow(info->currTableDataCtx);
|
||||
}
|
||||
if (unlikely(ret != TSDB_CODE_SUCCESS)) {
|
||||
smlBuildInvalidDataMsg(&info->msgBuf, "smlBuildCol error", NULL);
|
||||
return ret;
|
||||
}
|
||||
}else{
|
||||
if(elements->colArray == NULL){
|
||||
elements->colArray = taosArrayInit(16, sizeof(SSmlKv));
|
||||
}
|
||||
taosArrayPush(elements->colArray, &kvTs);
|
||||
taosArrayPush(elements->colArray, &kv);
|
||||
}
|
||||
info->preLine = *elements;
|
||||
|
||||
return TSDB_CODE_SUCCESS;
|
||||
}
|
||||
|
||||
int32_t smlParseJSON(SSmlHandle *info, char *payload) {
|
||||
int32_t payloadNum = 1 << 15;
|
||||
int32_t ret = TSDB_CODE_SUCCESS;
|
||||
|
@ -1152,6 +1171,7 @@ int32_t smlParseJSON(SSmlHandle *info, char *payload) {
|
|||
}
|
||||
if (unlikely(ret != TSDB_CODE_SUCCESS)) {
|
||||
uError("SML:0x%" PRIx64 " Invalid JSON Payload 1:%s", info->id, payload);
|
||||
info->parseJsonByLib = true;
|
||||
return smlParseJSONExt(info, payload);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue