提交 d5e69472 编写于 作者: H Hongze Cheng

TD-90

上级 b435e512
...@@ -278,9 +278,10 @@ typedef struct { ...@@ -278,9 +278,10 @@ typedef struct {
#define kvRowColVal(r, colIdx) POINTER_SHIFT(kvRowValues(r), (colIdx)->offset) #define kvRowColVal(r, colIdx) POINTER_SHIFT(kvRowValues(r), (colIdx)->offset)
#define kvRowColIdxAt(r, i) (kvRowColIdx(r) + (i)) #define kvRowColIdxAt(r, i) (kvRowColIdx(r) + (i))
#define kvRowFree(r) tfree(r) #define kvRowFree(r) tfree(r)
#define kvRowEnd(r) POINTER_SHIFT(r, kvRowLen(r))
SKVRow tdKVRowDup(SKVRow row); SKVRow tdKVRowDup(SKVRow row);
SKVRow tdSetKVRowDataOfCol(SKVRow row, int16_t colId, int8_t type, void *value); int tdSetKVRowDataOfCol(SKVRow *orow, int16_t colId, int8_t type, void *value);
void * tdEncodeKVRow(void *buf, SKVRow row); void * tdEncodeKVRow(void *buf, SKVRow row);
void * tdDecodeKVRow(void *buf, SKVRow *row); void * tdDecodeKVRow(void *buf, SKVRow *row);
......
...@@ -477,69 +477,96 @@ SKVRow tdKVRowDup(SKVRow row) { ...@@ -477,69 +477,96 @@ SKVRow tdKVRowDup(SKVRow row) {
return trow; return trow;
} }
SKVRow tdSetKVRowDataOfCol(SKVRow row, int16_t colId, int8_t type, void *value) { int tdSetKVRowDataOfCol(SKVRow *orow, int16_t colId, int8_t type, void *value) {
// TODO SColIdx *pColIdx = NULL;
return NULL; SKVRow row = *orow;
// SColIdx *pColIdx = NULL; SKVRow nrow = NULL;
// SKVRow rrow = row; void * ptr = taosbsearch(&colId, kvRowColIdx(row), kvRowNCols(row), sizeof(SColIdx), comparTagId, TD_GE);
// SKVRow 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) :
// if (ptr == NULL || ((SColIdx *)ptr)->colId < colId) { // need to add a column value to the row // TYPE_BYTES[type]); nrow = malloc(tlen); if (nrow == NULL) return NULL;
// 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);
// kvDataRowSetNCols(nrow, kvDataRowNCols(row)+1);
// kvDataRowSetLen(nrow, tlen); // if (ptr == NULL) ptr = kvDataRowValues(row);
// if (ptr == NULL) ptr = kvDataRowValues(row); // // Copy the columns before the col
// if (POINTER_DISTANCE(ptr, kvDataRowColIdx(row)) > 0) {
// // Copy the columns before the col // memcpy(kvDataRowColIdx(nrow), kvDataRowColIdx(row), POINTER_DISTANCE(ptr, kvDataRowColIdx(row)));
// if (POINTER_DISTANCE(ptr, kvDataRowColIdx(row)) > 0) { // memcpy(kvDataRowValues(nrow), kvDataRowValues(row), ((SColIdx *)ptr)->offset); // TODO: here is not correct
// 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));
// // Set the new col value // pColIdx->colId = colId;
// pColIdx = (SColIdx *)POINTER_SHIFT(nrow, POINTER_DISTANCE(ptr, row)); // pColIdx->offset = ((SColIdx *)ptr)->offset; // TODO: here is not correct
// 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));
// if (IS_VAR_DATA_TYPE(type)) { // } else {
// memcpy(POINTER_SHIFT(kvDataRowValues(nrow), pColIdx->offset), value, varDataLen(value)); // memcpy(POINTER_SHIFT(kvDataRowValues(nrow), pColIdx->offset), value, TYPE_BYTES[type]);
// } 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) {
// // Copy the columns after the col // // TODO: memcpy();
// if (POINTER_DISTANCE(kvDataRowValues(row), ptr) > 0) { // }
// // TODO: memcpy(); } else {
// } ASSERT(((SColIdx *)ptr)->colId == colId);
// } else { if (IS_VAR_DATA_TYPE(type)) {
// // TODO void *pOldVal = kvRowColVal(row, (SColIdx *)ptr);
// ASSERT(((SColIdx *)ptr)->colId == colId);
// if (IS_VAR_DATA_TYPE(type)) { if (varDataTLen(value) == varDataTLen(pOldVal)) { // just update the column value in place
// void *pOldVal = kvDataRowColVal(row, (SColIdx *)ptr); memcpy(pOldVal, value, varDataTLen(value));
} else { // need to reallocate the memory
// if (varDataTLen(value) == varDataTLen(pOldVal)) { // just update the column value in place int16_t diff = varDataTLen(value) - varDataTLen(pOldVal);
// memcpy(pOldVal, value, varDataTLen(value)); int16_t nlen = kvRowLen(row) + diff;
// } else { // enlarge the memory ASSERT(nlen > 0);
// // rrow = realloc(rrow, kvDataRowLen(rrow) + varDataTLen(value) - varDataTLen(pOldVal)); nrow = malloc(nlen);
// // if (rrow == NULL) return NULL; if (nrow == NULL) {
// // memmove(); // TODO: deal with the error here
// // for () { }
// // ((SColIdx *)ptr)->offset += balabala;
// // } kvRowSetLen(nrow, nlen);
kvRowSetNCols(nrow, kvRowNCols(row));
// // kvDataRowSetLen();
// Copy part ahead
// } nlen = POINTER_DISTANCE(ptr, kvRowColIdx(row));
// } else { ASSERT(nlen % sizeof(SColIdx) == 0);
// memcpy(kvDataRowColVal(row, (SColIdx *)ptr), value, TYPE_BYTES[type]); if (nlen > 0) {
// } ASSERT(((SColIdx *)ptr)->offset > 0);
// } memcpy(kvRowColIdx(nrow), kvRowColIdx(row), nlen);
memcpy(kvRowValues(nrow), kvRowValues(row), ((SColIdx *)ptr)->offset);
// return rrow; }
// Construct current column value
int colIdx = nlen / sizeof(SColIdx);
pColIdx = kvRowColIdxAt(nrow, colIdx);
pColIdx->colId = ((SColIdx *)ptr)->colId;
pColIdx->offset = ((SColIdx *)ptr)->offset;
memcpy(kvRowColVal(nrow, pColIdx), value, varDataTLen(value));
// Construct columns after
if (kvRowNCols(nrow) - colIdx - 1 > 0) {
for (int i = colIdx + 1; i < kvRowNCols(nrow); i++) {
kvRowColIdxAt(nrow, i)->colId = kvRowColIdxAt(row, i)->colId;
kvRowColIdxAt(nrow, i)->offset += diff;
}
memcpy(kvRowColVal(nrow, kvRowColIdxAt(nrow, colIdx + 1)), kvRowColVal(row, kvRowColIdxAt(row, colIdx + 1)),
POINTER_DISTANCE(kvRowEnd(row), kvRowColVal(row, kvRowColIdxAt(row, colIdx + 1))));
}
free(row);
*orow = nrow;
}
} else {
memcpy(kvRowColVal(row, (SColIdx *)ptr), value, TYPE_BYTES[type]);
}
}
return 0;
} }
void *tdEncodeKVRow(void *buf, SKVRow row) { void *tdEncodeKVRow(void *buf, SKVRow row) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册