refactor: add to_json function
This commit is contained in:
parent
d2d29d992f
commit
24f805c5c2
|
@ -76,6 +76,7 @@ int32_t castFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutp
|
||||||
/* Time related functions */
|
/* Time related functions */
|
||||||
int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t toUnixtimestampFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t toUnixtimestampFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
int32_t toJsonFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t timeDiffFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t timeDiffFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
int32_t nowFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t nowFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
|
@ -76,7 +76,7 @@ char* tjsonToString(const SJson* pJson);
|
||||||
char* tjsonToUnformattedString(const SJson* pJson);
|
char* tjsonToUnformattedString(const SJson* pJson);
|
||||||
|
|
||||||
SJson* tjsonParse(const char* pStr);
|
SJson* tjsonParse(const char* pStr);
|
||||||
bool tjsonIsObject(const SJson* pJson);
|
bool tjsonValidateJson(const char* pJson);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -893,7 +893,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.translateFunc = translateToJson,
|
.translateFunc = translateToJson,
|
||||||
.getEnvFunc = NULL,
|
.getEnvFunc = NULL,
|
||||||
.initFunc = NULL,
|
.initFunc = NULL,
|
||||||
.sprocessFunc = NULL,
|
.sprocessFunc = toJsonFunction,
|
||||||
.finalizeFunc = NULL
|
.finalizeFunc = NULL
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
#include "sclInt.h"
|
#include "sclInt.h"
|
||||||
#include "sclvector.h"
|
#include "sclvector.h"
|
||||||
|
#include "tjson.h"
|
||||||
|
|
||||||
typedef float (*_float_fn)(float);
|
typedef float (*_float_fn)(float);
|
||||||
typedef double (*_double_fn)(double);
|
typedef double (*_double_fn)(double);
|
||||||
|
@ -920,6 +921,59 @@ int32_t toUnixtimestampFunction(SScalarParam *pInput, int32_t inputNum, SScalarP
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t toJsonFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
|
int32_t type = GET_PARAM_TYPE(pInput);
|
||||||
|
if (type != TSDB_DATA_TYPE_BINARY && type != TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (inputNum != 1) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *input = pInput[0].columnData->pData + pInput[0].columnData->varmeta.offset[0];
|
||||||
|
char *tmp = taosMemoryCalloc(pInput[0].columnData->info.bytes + 1, 1);
|
||||||
|
for (int32_t i = 0; i < pInput[0].numOfRows; ++i) {
|
||||||
|
if (colDataIsNull_s(pInput[0].columnData, i)) {
|
||||||
|
colDataAppendNULL(pOutput->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(type == TSDB_DATA_TYPE_NCHAR){
|
||||||
|
if (varDataTLen(input) > TSDB_MAX_JSON_TAG_LEN){
|
||||||
|
colDataAppendNULL(pOutput->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int32_t len = taosUcs4ToMbs((TdUcs4 *)varDataVal(input), varDataLen(input), tmp);
|
||||||
|
if (len < 0) {
|
||||||
|
colDataAppendNULL(pOutput->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
tmp[len] = 0;
|
||||||
|
}else{
|
||||||
|
if (varDataLen(input) > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE){
|
||||||
|
colDataAppendNULL(pOutput->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
memcpy(tmp, varDataVal(input), varDataLen(input));
|
||||||
|
tmp[varDataTLen(input)] = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!tjsonValidateJson(tmp)){
|
||||||
|
colDataAppendNULL(pOutput->columnData, i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
colDataAppend(pOutput->columnData, i, input, false);
|
||||||
|
input += varDataTLen(input);
|
||||||
|
}
|
||||||
|
taosMemoryFree(tmp);
|
||||||
|
|
||||||
|
pOutput->numOfRows = pInput->numOfRows;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
int32_t timeTruncateFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput) {
|
||||||
int32_t type = GET_PARAM_TYPE(&pInput[0]);
|
int32_t type = GET_PARAM_TYPE(&pInput[0]);
|
||||||
int32_t timePrec = GET_PARAM_PRECISON(&pInput[0]);
|
int32_t timePrec = GET_PARAM_PRECISON(&pInput[0]);
|
||||||
|
|
|
@ -276,4 +276,37 @@ int32_t tjsonToArray(const SJson* pJson, const char* pName, FToObject func, void
|
||||||
}
|
}
|
||||||
|
|
||||||
SJson* tjsonParse(const char* pStr) { return cJSON_Parse(pStr); }
|
SJson* tjsonParse(const char* pStr) { return cJSON_Parse(pStr); }
|
||||||
bool tjsonIsObject(const SJson* pJson) { return cJSON_IsObject(pJson); }
|
|
||||||
|
bool tjsonValidateJson(const char *jIn) {
|
||||||
|
if (!jIn){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// set json real data
|
||||||
|
cJSON *root = cJSON_Parse(jIn);
|
||||||
|
if (root == NULL){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!cJSON_IsObject(root)){
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int size = cJSON_GetArraySize(root);
|
||||||
|
for(int i = 0; i < size; i++) {
|
||||||
|
cJSON* item = cJSON_GetArrayItem(root, i);
|
||||||
|
if (!item) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
char* jsonKey = item->string;
|
||||||
|
if (!jsonKey) return false;
|
||||||
|
for (size_t j = 0; j < strlen(jsonKey); ++i) {
|
||||||
|
if (isprint(jsonKey[i]) == 0) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->type == cJSON_Object || item->type == cJSON_Array) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
Loading…
Reference in New Issue