diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h index 8038401867..df0a479fcc 100644 --- a/include/common/tdataformat.h +++ b/include/common/tdataformat.h @@ -88,9 +88,9 @@ void tTSchemaDestroy(STSchema *pTSchema); #define COL_VAL_IS_VALUE(CV) ((CV)->flag == CV_FLAG_VALUE) // SRow ================================ -int32_t tTSRowPut(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer); -void tTSRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal); -int32_t tTSRowToArray(SRow *pRow, STSchema *pTSchema, SArray **ppArray); +int32_t tRowPut(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer); +void tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal); +int32_t tRowToArr(SRow *pRow, STSchema *pTSchema, SArray **aColValP); // SRowIter ================================ diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c index 6a676c51b7..13dcf8ff3b 100644 --- a/source/common/src/tdataformat.c +++ b/source/common/src/tdataformat.c @@ -46,37 +46,21 @@ int32_t tBufferPut(SBuffer *pBuffer, const void *pData, int64_t nData) { // ================================ static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson); -#pragma pack(push, 1) -typedef struct { - int16_t nCols; - uint8_t idx[]; -} STSKVRow; -#pragma pack(pop) - -#define TSROW_IS_KV_ROW(r) ((r)->flags & TSROW_KV_ROW) - -// SValue -static FORCE_INLINE int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) { - if (IS_VAR_DATA_TYPE(type)) { - return tPutBinary(p, pValue->pData, pValue->nData); - } else { - if (p) memcpy(p, &pValue->val, tDataTypes[type].bytes); - return tDataTypes[type].bytes; - } -} - // SRow ======================================================================== -int32_t tTSRowPut(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer) { - int32_t code = 0; +#define ROW_FLG_KV ((uint8_t)0x10) - ASSERT(taosArrayGetSize(aColVal) == 0); +int32_t tRowPut(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer) { + int32_t code = 0; uint8_t flag = 0; int32_t iColVal = 0; - SColVal *pColVal = taosArrayGet(aColVal, iColVal); + int32_t nColVal = (int32_t)taosArrayGetSize(aColVal); + SColVal *pColVal = (SColVal *)taosArrayGet(aColVal, iColVal); int32_t iTColumn = 0; STColumn *pTColumn = pTSchema->columns + iTColumn; + int32_t ntp = sizeof(SRow); + int32_t nkv = sizeof(SRow); while (pTColumn) { if (pColVal) { if (pColVal->cid == pTColumn->colId) { @@ -88,12 +72,12 @@ int32_t tTSRowPut(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer) { flag |= HAS_NULL; } pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; - pColVal = (++iColVal < taosArrayGetSize(aColVal)) ? taosArrayGet(aColVal, iColVal) : NULL; - } else if (pColVal->cid < pTColumn->colId) { - pColVal = (++iColVal < taosArrayGetSize(aColVal)) ? taosArrayGet(aColVal, iColVal) : NULL; - } else { // NONE + pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL; + } else if (pColVal->cid > pTColumn->colId) { // NONE flag |= HAS_NONE; pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + } else { + pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL; } } else { // NONE flag |= HAS_NONE; @@ -101,6 +85,71 @@ int32_t tTSRowPut(SArray *aColVal, STSchema *pTSchema, SBuffer *pBuffer) { } } + SRow *pRow = NULL; // todo + + iColVal = 0; + pColVal = (SColVal *)taosArrayGet(aColVal, iColVal); + iTColumn = 0; + pTColumn = pTSchema->columns + iTColumn; + if (ntp <= nkv) { // tuple row + pRow->flag = flag; + pRow->sver = pTSchema->version; + pRow->len = ntp; + + while (pTColumn) { + if (pColVal) { + if (pColVal->cid == pTColumn->colId) { + if (COL_VAL_IS_VALUE(pColVal)) { // VALUE + flag |= HAS_VALUE; + } else if (COL_VAL_IS_NONE(pColVal)) { // NONE + flag |= HAS_NONE; + } else { // NULL + flag |= HAS_NULL; + } + pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL; + } else if (pColVal->cid > pTColumn->colId) { // NONE + flag |= HAS_NONE; + pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + } else { + pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL; + } + } else { // NONE + flag |= HAS_NONE; + pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + } + } + + } else { // kv row + pRow->flag = flag | ROW_FLG_KV; + pRow->sver = pTSchema->version; + pRow->len = ntp; + + while (pTColumn) { + if (pColVal) { + if (pColVal->cid == pTColumn->colId) { + if (COL_VAL_IS_VALUE(pColVal)) { // VALUE + flag |= HAS_VALUE; + } else if (COL_VAL_IS_NONE(pColVal)) { // NONE + flag |= HAS_NONE; + } else { // NULL + flag |= HAS_NULL; + } + pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL; + } else if (pColVal->cid > pTColumn->colId) { // NONE + flag |= HAS_NONE; + pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + } else { + pColVal = (++iColVal < nColVal) ? (SColVal *)taosArrayGet(aColVal, iColVal) : NULL; + } + } else { // NONE + flag |= HAS_NONE; + pTColumn = (++iTColumn < pTSchema->numOfCols) ? pTSchema->columns + iTColumn : NULL; + } + } + } + #if 0 STColumn *pTColumn; SColVal *pColVal;