fix(query): add hex encoding/decoding for transmitting nchar constant
from client to server in JSON
This commit is contained in:
parent
45e8eeb9f8
commit
455737f2cb
|
@ -59,6 +59,8 @@ bool taosMbsToUcs4(const char *mbs, size_t mbs_len, TdUcs4 *ucs4, int32_t ucs
|
||||||
int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes);
|
int32_t tasoUcs4Compare(TdUcs4 *f1_ucs4, TdUcs4 *f2_ucs4, int32_t bytes);
|
||||||
TdUcs4* tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4);
|
TdUcs4* tasoUcs4Copy(TdUcs4 *target_ucs4, TdUcs4 *source_ucs4, int32_t len_ucs4);
|
||||||
bool taosValidateEncodec(const char *encodec);
|
bool taosValidateEncodec(const char *encodec);
|
||||||
|
int32_t taosHexEncode(const char *src, char *dst, int32_t len);
|
||||||
|
int32_t taosHexDecode(const char *src, char *dst, int32_t len);
|
||||||
|
|
||||||
int32_t taosWcharWidth(TdWchar wchar);
|
int32_t taosWcharWidth(TdWchar wchar);
|
||||||
int32_t taosWcharsWidth(TdWchar *pWchar, int32_t size);
|
int32_t taosWcharsWidth(TdWchar *pWchar, int32_t size);
|
||||||
|
|
|
@ -1699,7 +1699,18 @@ static int32_t datumToJson(const void* pObj, SJson* pJson) {
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
code = tjsonAddDoubleToObject(pJson, jkValueDatum, pNode->datum.d);
|
code = tjsonAddDoubleToObject(pJson, jkValueDatum, pNode->datum.d);
|
||||||
break;
|
break;
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
|
//cJSON only support utf-8 encoding. Convert memory content to hex string.
|
||||||
|
char *buf = taosMemoryCalloc(varDataLen(pNode->datum.p) * 2 + 1, sizeof(char));
|
||||||
|
code = taosHexEncode(varDataVal(pNode->datum.p), buf, varDataLen(pNode->datum.p));
|
||||||
|
if(code != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
|
}
|
||||||
|
code = tjsonAddStringToObject(pJson, jkValueDatum, buf);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
code = tjsonAddStringToObject(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
code = tjsonAddStringToObject(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
||||||
|
@ -1773,8 +1784,27 @@ static int32_t jsonToDatum(const SJson* pJson, void* pObj) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
varDataSetLen(pNode->datum.p, pNode->node.resType.bytes);
|
varDataSetLen(pNode->datum.p, pNode->node.resType.bytes - VARSTR_HEADER_SIZE);
|
||||||
code = tjsonGetStringValue(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
if (TSDB_DATA_TYPE_NCHAR == pNode->node.resType.type) {
|
||||||
|
char *buf = taosMemoryCalloc(1, pNode->node.resType.bytes * 2 + VARSTR_HEADER_SIZE + 1);
|
||||||
|
if (NULL == buf) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
code = tjsonGetStringValue(pJson, jkValueDatum, buf);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
code = taosHexDecode(buf, varDataVal(pNode->datum.p), pNode->node.resType.bytes - VARSTR_HEADER_SIZE);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
} else {
|
||||||
|
code = tjsonGetStringValue(pJson, jkValueDatum, varDataVal(pNode->datum.p));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON:
|
||||||
|
|
|
@ -195,6 +195,36 @@ int32_t taosUcs4len(TdUcs4 *ucs4) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//dst buffer size should be at least 2*len + 1
|
||||||
|
int32_t taosHexEncode(const char *src, char *dst, int32_t len) {
|
||||||
|
if (!dst) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < len; ++i) {
|
||||||
|
sprintf(dst + i * 2, "%02x", src[i] & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t taosHexDecode(const char *src, char *dst, int32_t len) {
|
||||||
|
if (!dst) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t hn, ln, out;
|
||||||
|
for (int i = 0, j = 0; i < len * 2; i += 2, ++j ) {
|
||||||
|
hn = src[i] > '9' ? src[i] - 'A' + 10 : src[i] - '0';
|
||||||
|
ln = src[i + 1] > '9' ? src[i + 1] - 'A' + 10 : src[i + 1] - '0';
|
||||||
|
|
||||||
|
out = (hn << 4) | ln;
|
||||||
|
memcpy(dst + j, &out, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t taosWcharWidth(TdWchar wchar) { return wcwidth(wchar); }
|
int32_t taosWcharWidth(TdWchar wchar) { return wcwidth(wchar); }
|
||||||
|
|
||||||
int32_t taosWcharsWidth(TdWchar *pWchar, int32_t size) { return wcswidth(pWchar, size); }
|
int32_t taosWcharsWidth(TdWchar *pWchar, int32_t size) { return wcswidth(pWchar, size); }
|
||||||
|
|
Loading…
Reference in New Issue