From 8c7100e89400566e164d417a56b2ae1baf1a2878 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Sat, 30 May 2020 10:00:49 +0000 Subject: [PATCH] add kv data row definition --- src/common/inc/tdataformat.h | 49 +++++++++++++++++++++ src/common/src/tdataformat.c | 85 ++++++++++++++++++++++++++++++++++++ src/inc/taosdef.h | 1 + src/util/inc/tutil.h | 1 + 4 files changed, 136 insertions(+) diff --git a/src/common/inc/tdataformat.h b/src/common/inc/tdataformat.h index 3f33c96e96..a9350769a1 100644 --- a/src/common/inc/tdataformat.h +++ b/src/common/inc/tdataformat.h @@ -19,6 +19,7 @@ #include #include +#include "talgo.h" #include "taosdef.h" #include "tutil.h" @@ -218,6 +219,54 @@ int tdMergeDataCols(SDataCols *target, SDataCols *src, int rowsToMerge); void tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, SDataCols *src2, int *iter2, int tRows); +// ----------------- K-V data row structure +/* + * +----------+----------+---------------------------------+---------------------------------+ + * | int16_t | int16_t | | | + * +----------+----------+---------------------------------+---------------------------------+ + * | len | ncols | cols index | data part | + * +----------+----------+---------------------------------+---------------------------------+ + */ +typedef void *SKVDataRow; + +typedef struct { + int16_t colId; + int16_t offset; +} SColIdx; + +#define TD_KV_DATA_ROW_HEAD_SIZE 2*sizeof(int16_t) + +#define kvDataRowLen(r) (*(int16_t *)(r)) +#define kvDataRowNCols(r) (*(int16_t *)POINTER_SHIFT(r, sizeof(int16_t))) +#define kvDataRowColIdx(r) (SColIdx *)POINTER_SHIFT(r, TD_KV_DATA_ROW_HEAD_SIZE) +#define kvDataRowValues(r) POINTER_SHIFT(r, TD_KV_DATA_ROW_HEAD_SIZE + sizeof(SColIdx) * kvDataRowNCols(r)) +#define kvDataRowCpy(dst, r) memcpy((dst), (r), kvDataRowLen(r)) +#define kvDataRowColVal(r, colIdx) POINTER_SHIFT(kvDataRowValues(r), (colIdx)->offset) +#define kvDataRowSetLen(r, len) kvDataRowLen(r) = (len) +#define kvDataRowSetNCols(r, n) kvDataRowNCols(r) = (n) +#define kvDataRowColIdxAt(r, i) (kvDataRowColIdx(r) + (i)) + +SKVDataRow tdKVDataRowDup(SKVDataRow row); +SKVDataRow tdSetKVRowDataOfCol(SKVDataRow row, int16_t colId, int8_t type, void *value); +void * tdEncodeKVDataRow(void *buf, SKVDataRow row); +void * tdDecodeKVDataRow(void *buf, SKVDataRow *row); + +static FORCE_INLINE int comparTagId(const void *key1, const void *key2) { + if (*(int16_t *)key1 > ((SColIdx *)key2)->colId) { + return 1; + } else if (*(int16_t *)key1 < ((SColIdx *)key2)->colId) { + return -1; + } else { + return 0; + } +} + +static FORCE_INLINE void *tdGetKVRowDataOfCol(SKVDataRow row, int16_t colId) { + void *ret = taosbsearch(&colId, kvDataRowColIdx(row), kvDataRowNCols(row), sizeof(SColIdx), comparTagId, TD_EQ); + if (ret == NULL) return NULL; + return kvDataRowColVal(row, (SColIdx *)ret); +} + // ----------------- Tag row structure /* A tag row, the format is like below: diff --git a/src/common/src/tdataformat.c b/src/common/src/tdataformat.c index 922c8bdea0..3429970e73 100644 --- a/src/common/src/tdataformat.c +++ b/src/common/src/tdataformat.c @@ -594,4 +594,89 @@ void tdMergeTwoDataCols(SDataCols *target, SDataCols *src1, int *iter1, SDataCol (*iter2)++; } } +} + +SKVDataRow tdKVDataRowDup(SKVDataRow row) { + SKVDataRow trow = malloc(kvDataRowLen(row)); + if (trow == NULL) return NULL; + + kvDataRowCpy(trow, row); + return trow; +} + +SKVDataRow tdSetKVRowDataOfCol(SKVDataRow row, int16_t colId, int8_t type, void *value) { + // TODO + return NULL; + // SColIdx *pColIdx = NULL; + // SKVDataRow rrow = row; + // SKVDataRow nrow = NULL; + // void *ptr = taosbsearch(&colId, kvDataRowColIdx(row), kvDataRowNCols(row), sizeof(SColIdx), comparTagId, TD_GE); + + // if (ptr == NULL || ((SColIdx *)ptr)->colId < colId) { // need to add a column value to the row + // int tlen = kvDataRowLen(row) + sizeof(SColIdx) + (IS_VAR_DATA_TYPE(type) ? varDataTLen(value) : TYPE_BYTES[type]); + // nrow = malloc(tlen); + // if (nrow == NULL) return NULL; + + // kvDataRowSetNCols(nrow, kvDataRowNCols(row)+1); + // kvDataRowSetLen(nrow, tlen); + + // if (ptr == NULL) ptr = kvDataRowValues(row); + + // // Copy the columns before the col + // if (POINTER_DISTANCE(ptr, kvDataRowColIdx(row)) > 0) { + // memcpy(kvDataRowColIdx(nrow), kvDataRowColIdx(row), POINTER_DISTANCE(ptr, kvDataRowColIdx(row))); + // memcpy(kvDataRowValues(nrow), kvDataRowValues(row), ((SColIdx *)ptr)->offset); // TODO: here is not correct + // } + + // // Set the new col value + // pColIdx = (SColIdx *)POINTER_SHIFT(nrow, POINTER_DISTANCE(ptr, row)); + // pColIdx->colId = colId; + // pColIdx->offset = ((SColIdx *)ptr)->offset; // TODO: here is not correct + + // if (IS_VAR_DATA_TYPE(type)) { + // memcpy(POINTER_SHIFT(kvDataRowValues(nrow), pColIdx->offset), value, varDataLen(value)); + // } else { + // memcpy(POINTER_SHIFT(kvDataRowValues(nrow), pColIdx->offset), value, TYPE_BYTES[type]); + // } + + // // Copy the columns after the col + // if (POINTER_DISTANCE(kvDataRowValues(row), ptr) > 0) { + // // TODO: memcpy(); + // } + // } else { + // // TODO + // ASSERT(((SColIdx *)ptr)->colId == colId); + // if (IS_VAR_DATA_TYPE(type)) { + // void *pOldVal = kvDataRowColVal(row, (SColIdx *)ptr); + + // if (varDataTLen(value) == varDataTLen(pOldVal)) { // just update the column value in place + // memcpy(pOldVal, value, varDataTLen(value)); + // } else { // enlarge the memory + // // rrow = realloc(rrow, kvDataRowLen(rrow) + varDataTLen(value) - varDataTLen(pOldVal)); + // // if (rrow == NULL) return NULL; + // // memmove(); + // // for () { + // // ((SColIdx *)ptr)->offset += balabala; + // // } + + // // kvDataRowSetLen(); + + // } + // } else { + // memcpy(kvDataRowColVal(row, (SColIdx *)ptr), value, TYPE_BYTES[type]); + // } + // } + + // return rrow; +} + +void *tdEncodeKVDataRow(void *buf, SKVDataRow row) { + // May change the encode purpose + kvDataRowCpy(buf, row); + return POINTER_SHIFT(buf, kvDataRowLen(row)); +} + +void *tdDecodeKVDataRow(void *buf, SKVDataRow *row) { + *row = tdKVDataRowDup(buf); + return POINTER_SHIFT(buf, kvDataRowLen(*row)); } \ No newline at end of file diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index 548a39ad42..68efcb8b81 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -52,6 +52,7 @@ typedef struct tstr { #define varDataCopy(dst, v) memcpy((dst), (void*) (v), varDataTLen(v)) #define varDataLenByData(v) (*(VarDataLenT *)(((char*)(v)) - VARSTR_HEADER_SIZE)) #define varDataSetLen(v, _len) (((VarDataLenT *)(v))[0] = (VarDataLenT) (_len)) +#define IS_VAR_DATA_TYPE(t) (((t) == TSDB_DATA_TYPE_BINARY) || ((t) == TSDB_DATA_TYPE_NCHAR)) // this data type is internally used only in 'in' query to hold the values #define TSDB_DATA_TYPE_ARRAY (TSDB_DATA_TYPE_NCHAR + 1) diff --git a/src/util/inc/tutil.h b/src/util/inc/tutil.h index 5dcb6e406f..527394d13a 100644 --- a/src/util/inc/tutil.h +++ b/src/util/inc/tutil.h @@ -46,6 +46,7 @@ extern "C" { // Pointer p drift right by b bytes #define POINTER_SHIFT(p, b) ((void *)((char *)(p) + (b))) +#define POINTER_DISTANCE(p1, p2) ((char *)p1 - (char *)p2) #ifndef NDEBUG #define ASSERT(x) assert(x) -- GitLab