feat: show create table
This commit is contained in:
parent
be2935cba6
commit
b084be71f6
|
@ -208,6 +208,7 @@ char* jobTaskStatusStr(int32_t status);
|
||||||
SSchema createSchema(int8_t type, int32_t bytes, col_id_t colId, const char* name);
|
SSchema createSchema(int8_t type, int32_t bytes, col_id_t colId, const char* name);
|
||||||
void destroyQueryExecRes(SQueryExecRes* pRes);
|
void destroyQueryExecRes(SQueryExecRes* pRes);
|
||||||
int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *len);
|
int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t *len);
|
||||||
|
char* parseTagDatatoJson(void* p);
|
||||||
|
|
||||||
extern int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallocFp)(int32_t));
|
extern int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void*(*mallocFp)(int32_t));
|
||||||
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
||||||
|
|
|
@ -1444,80 +1444,6 @@ static int32_t doPrepareResPtr(SReqResultInfo* pResInfo) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char* parseTagDatatoJson(void* p) {
|
|
||||||
char* string = NULL;
|
|
||||||
cJSON* json = cJSON_CreateObject();
|
|
||||||
if (json == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
SArray* pTagVals = NULL;
|
|
||||||
if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
|
|
||||||
int16_t nCols = taosArrayGetSize(pTagVals);
|
|
||||||
char tagJsonKey[256] = {0};
|
|
||||||
for (int j = 0; j < nCols; ++j) {
|
|
||||||
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
|
||||||
// json key encode by binary
|
|
||||||
memset(tagJsonKey, 0, sizeof(tagJsonKey));
|
|
||||||
memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
|
|
||||||
// json value
|
|
||||||
char type = pTagVal->type;
|
|
||||||
if (type == TSDB_DATA_TYPE_NULL) {
|
|
||||||
cJSON* value = cJSON_CreateNull();
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
cJSON* value = NULL;
|
|
||||||
if (pTagVal->nData > 0) {
|
|
||||||
char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
|
|
||||||
int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
|
|
||||||
if (length < 0) {
|
|
||||||
tscError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
|
||||||
pTagVal->pData);
|
|
||||||
taosMemoryFree(tagJsonValue);
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
value = cJSON_CreateString(tagJsonValue);
|
|
||||||
taosMemoryFree(tagJsonValue);
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
} else if (pTagVal->nData == 0) {
|
|
||||||
value = cJSON_CreateString("");
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
|
||||||
double jsonVd = *(double*)(&pTagVal->i64);
|
|
||||||
cJSON* value = cJSON_CreateNumber(jsonVd);
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
|
||||||
char jsonVd = *(char*)(&pTagVal->i64);
|
|
||||||
cJSON* value = cJSON_CreateBool(jsonVd);
|
|
||||||
if (value == NULL) {
|
|
||||||
goto end;
|
|
||||||
}
|
|
||||||
cJSON_AddItemToObject(json, tagJsonKey, value);
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
string = cJSON_PrintUnformatted(json);
|
|
||||||
end:
|
|
||||||
cJSON_Delete(json);
|
|
||||||
return string;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
|
static int32_t doConvertUCS4(SReqResultInfo* pResultInfo, int32_t numOfRows, int32_t numOfCols, int32_t* colLength) {
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
int32_t type = pResultInfo->fields[i].type;
|
int32_t type = pResultInfo->fields[i].type;
|
||||||
|
|
|
@ -1918,7 +1918,7 @@ int32_t tDeserializeSTableCfgRsp(void *buf, int32_t bufLen, STableCfgRsp *pRsp)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tDecodeI32(&decoder, &pRsp->tagsLen) < 0) return -1;
|
if (tDecodeI32(&decoder, &pRsp->tagsLen) < 0) return -1;
|
||||||
if (tDecodeBinaryAlloc(&decoder, &pRsp->pTags, NULL) < 0) return -1;
|
if (tDecodeBinaryAlloc(&decoder, (void**)&pRsp->pTags, NULL) < 0) return -1;
|
||||||
|
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
|
|
|
@ -332,6 +332,15 @@ void appendTagFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void appendTagNameFields(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
|
||||||
|
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s`%s`", ((i > 0) ? ", " : ""), pSchema->name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
SArray *pTagVals = NULL;
|
SArray *pTagVals = NULL;
|
||||||
STag *pTag = (STag*)pCfg->pTags;
|
STag *pTag = (STag*)pCfg->pTags;
|
||||||
|
@ -340,6 +349,7 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
char *pJson = parseTagDatatoJson(pTag);
|
char *pJson = parseTagDatatoJson(pTag);
|
||||||
if (pJson) {
|
if (pJson) {
|
||||||
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s", pJson);
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s", pJson);
|
||||||
|
taosMemoryFree(pJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -350,15 +360,40 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int16_t nCols = taosArrayGetSize(pTagVals);
|
int16_t valueNum = taosArrayGetSize(pTagVals);
|
||||||
int32_t num = 0;
|
int32_t num = 0;
|
||||||
for (int i = 0; i < nCols; i++) {
|
int32_t j = 0;
|
||||||
STagVal *pTagVal = (STagVal *)taosArrayGet(pTagVals, i);
|
for (int32_t i = 0; i < pCfg->numOfTags; ++i) {
|
||||||
char type = pTagVal->type;
|
SSchema* pSchema = pCfg->pSchemas + pCfg->numOfColumns + i;
|
||||||
int32_t tlen = 0;
|
if (i > 0) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, ", ");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (j >= valueNum) {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "NULL");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
STagVal *pTagVal = (STagVal *)taosArrayGet(pTagVals, j);
|
||||||
|
if (pSchema->colId > pTagVal->cid) {
|
||||||
|
qError("tag value and column mismatch, schemaId:%d, valId:%d", pSchema->colId, pTagVal->cid);
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
|
return TSDB_CODE_APP_ERROR;
|
||||||
|
} else if (pSchema->colId == pTagVal->cid) {
|
||||||
|
char type = pTagVal->type;
|
||||||
|
int32_t tlen = 0;
|
||||||
|
|
||||||
dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, pTagVal->pData, pTagVal->nData, &tlen);
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
*len += tlen;
|
dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, pTagVal->pData, pTagVal->nData, &tlen);
|
||||||
|
} else {
|
||||||
|
dataConverToStr(buf + VARSTR_HEADER_SIZE + *len, type, &pTagVal->i64, tDataTypes[type].bytes, &tlen);
|
||||||
|
}
|
||||||
|
*len += tlen;
|
||||||
|
j++;
|
||||||
|
} else {
|
||||||
|
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "NULL");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
if (type == TSDB_DATA_TYPE_BINARY) {
|
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
@ -389,6 +424,9 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
*/
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(pTagVals);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void appendTableOptions(char* buf, int32_t* len, STableCfg* pCfg) {
|
void appendTableOptions(char* buf, int32_t* len, STableCfg* pCfg) {
|
||||||
|
@ -444,7 +482,9 @@ static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, char *tbName,
|
||||||
appendTagFields(buf2, &len, pCfg);
|
appendTagFields(buf2, &len, pCfg);
|
||||||
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ")");
|
||||||
} else if (TSDB_CHILD_TABLE == pCfg->tableType) {
|
} else if (TSDB_CHILD_TABLE == pCfg->tableType) {
|
||||||
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE TABLE `%s` USING `%s` TAGS (", tbName, pCfg->stbName);
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE, "CREATE TABLE `%s` USING `%s` (", tbName, pCfg->stbName);
|
||||||
|
appendTagNameFields(buf2, &len, pCfg);
|
||||||
|
len += sprintf(buf2 + VARSTR_HEADER_SIZE + len, ") TAGS (");
|
||||||
code = appendTagValues(buf2, &len, pCfg);
|
code = appendTagValues(buf2, &len, pCfg);
|
||||||
if (code) {
|
if (code) {
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
#include "tsched.h"
|
#include "tsched.h"
|
||||||
|
#include "cJSON.h"
|
||||||
|
|
||||||
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
#define VALIDNUMOFCOLS(x) ((x) >= TSDB_MIN_COLUMNS && (x) <= TSDB_MAX_COLUMNS)
|
||||||
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
|
#define VALIDNUMOFTAGS(x) ((x) >= 0 && (x) <= TSDB_MAX_TAGS)
|
||||||
|
@ -297,4 +298,78 @@ int32_t dataConverToStr(char *str, int type, void *buf, int32_t bufSize, int32_t
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char* parseTagDatatoJson(void* p) {
|
||||||
|
char* string = NULL;
|
||||||
|
cJSON* json = cJSON_CreateObject();
|
||||||
|
if (json == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
SArray* pTagVals = NULL;
|
||||||
|
if (tTagToValArray((const STag*)p, &pTagVals) != 0) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
int16_t nCols = taosArrayGetSize(pTagVals);
|
||||||
|
char tagJsonKey[256] = {0};
|
||||||
|
for (int j = 0; j < nCols; ++j) {
|
||||||
|
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
|
||||||
|
// json key encode by binary
|
||||||
|
memset(tagJsonKey, 0, sizeof(tagJsonKey));
|
||||||
|
memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
|
||||||
|
// json value
|
||||||
|
char type = pTagVal->type;
|
||||||
|
if (type == TSDB_DATA_TYPE_NULL) {
|
||||||
|
cJSON* value = cJSON_CreateNull();
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
cJSON* value = NULL;
|
||||||
|
if (pTagVal->nData > 0) {
|
||||||
|
char* tagJsonValue = taosMemoryCalloc(pTagVal->nData, 1);
|
||||||
|
int32_t length = taosUcs4ToMbs((TdUcs4*)pTagVal->pData, pTagVal->nData, tagJsonValue);
|
||||||
|
if (length < 0) {
|
||||||
|
qError("charset:%s to %s. val:%s convert json value failed.", DEFAULT_UNICODE_ENCODEC, tsCharset,
|
||||||
|
pTagVal->pData);
|
||||||
|
taosMemoryFree(tagJsonValue);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
value = cJSON_CreateString(tagJsonValue);
|
||||||
|
taosMemoryFree(tagJsonValue);
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
} else if (pTagVal->nData == 0) {
|
||||||
|
value = cJSON_CreateString("");
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
|
||||||
|
double jsonVd = *(double*)(&pTagVal->i64);
|
||||||
|
cJSON* value = cJSON_CreateNumber(jsonVd);
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else if (type == TSDB_DATA_TYPE_BOOL) {
|
||||||
|
char jsonVd = *(char*)(&pTagVal->i64);
|
||||||
|
cJSON* value = cJSON_CreateBool(jsonVd);
|
||||||
|
if (value == NULL) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
cJSON_AddItemToObject(json, tagJsonKey, value);
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
string = cJSON_PrintUnformatted(json);
|
||||||
|
end:
|
||||||
|
cJSON_Delete(json);
|
||||||
|
return string;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue