Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
d5e69472
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
d5e69472
编写于
6月 02, 2020
作者:
H
Hongze Cheng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
TD-90
上级
b435e512
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
92 addition
and
64 deletion
+92
-64
src/common/inc/tdataformat.h
src/common/inc/tdataformat.h
+2
-1
src/common/src/tdataformat.c
src/common/src/tdataformat.c
+90
-63
未找到文件。
src/common/inc/tdataformat.h
浏览文件 @
d5e69472
...
...
@@ -278,9 +278,10 @@ typedef struct {
#define kvRowColVal(r, colIdx) POINTER_SHIFT(kvRowValues(r), (colIdx)->offset)
#define kvRowColIdxAt(r, i) (kvRowColIdx(r) + (i))
#define kvRowFree(r) tfree(r)
#define kvRowEnd(r) POINTER_SHIFT(r, kvRowLen(r))
SKVRow
tdKVRowDup
(
SKVRow
row
);
SKVRow
tdSetKVRowDataOfCol
(
SKVRow
row
,
int16_t
colId
,
int8_t
type
,
void
*
value
);
int
tdSetKVRowDataOfCol
(
SKVRow
*
o
row
,
int16_t
colId
,
int8_t
type
,
void
*
value
);
void
*
tdEncodeKVRow
(
void
*
buf
,
SKVRow
row
);
void
*
tdDecodeKVRow
(
void
*
buf
,
SKVRow
*
row
);
...
...
src/common/src/tdataformat.c
浏览文件 @
d5e69472
...
...
@@ -477,69 +477,96 @@ SKVRow tdKVRowDup(SKVRow row) {
return
trow
;
}
SKVRow
tdSetKVRowDataOfCol
(
SKVRow
row
,
int16_t
colId
,
int8_t
type
,
void
*
value
)
{
// TODO
return
NULL
;
// SColIdx *pColIdx = NULL;
// SKVRow rrow = row;
// 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) :
// 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;
int
tdSetKVRowDataOfCol
(
SKVRow
*
orow
,
int16_t
colId
,
int8_t
type
,
void
*
value
)
{
SColIdx
*
pColIdx
=
NULL
;
SKVRow
row
=
*
orow
;
SKVRow
nrow
=
NULL
;
void
*
ptr
=
taosbsearch
(
&
colId
,
kvRowColIdx
(
row
),
kvRowNCols
(
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
{
ASSERT
(((
SColIdx
*
)
ptr
)
->
colId
==
colId
);
if
(
IS_VAR_DATA_TYPE
(
type
))
{
void
*
pOldVal
=
kvRowColVal
(
row
,
(
SColIdx
*
)
ptr
);
if
(
varDataTLen
(
value
)
==
varDataTLen
(
pOldVal
))
{
// just update the column value in place
memcpy
(
pOldVal
,
value
,
varDataTLen
(
value
));
}
else
{
// need to reallocate the memory
int16_t
diff
=
varDataTLen
(
value
)
-
varDataTLen
(
pOldVal
);
int16_t
nlen
=
kvRowLen
(
row
)
+
diff
;
ASSERT
(
nlen
>
0
);
nrow
=
malloc
(
nlen
);
if
(
nrow
==
NULL
)
{
// TODO: deal with the error here
}
kvRowSetLen
(
nrow
,
nlen
);
kvRowSetNCols
(
nrow
,
kvRowNCols
(
row
));
// Copy part ahead
nlen
=
POINTER_DISTANCE
(
ptr
,
kvRowColIdx
(
row
));
ASSERT
(
nlen
%
sizeof
(
SColIdx
)
==
0
);
if
(
nlen
>
0
)
{
ASSERT
(((
SColIdx
*
)
ptr
)
->
offset
>
0
);
memcpy
(
kvRowColIdx
(
nrow
),
kvRowColIdx
(
row
),
nlen
);
memcpy
(
kvRowValues
(
nrow
),
kvRowValues
(
row
),
((
SColIdx
*
)
ptr
)
->
offset
);
}
// 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
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录