more TDB
This commit is contained in:
parent
e55d7662de
commit
0c9eb0fbc6
|
@ -738,6 +738,7 @@ static int tdbBtreeBalance(SBtCursor *pCur) {
|
||||||
|
|
||||||
#ifndef TDB_BTREE_CELL
|
#ifndef TDB_BTREE_CELL
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
/* Data */
|
||||||
} SCellEncoder;
|
} SCellEncoder;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -750,35 +751,82 @@ typedef struct {
|
||||||
u8 *pTmpSpace;
|
u8 *pTmpSpace;
|
||||||
} SCellDecoder;
|
} SCellDecoder;
|
||||||
|
|
||||||
static int tdbBtreeEncodeCell(SPage *pPage, void *pKey, int kLen, void *pVal, int vLen) {
|
static int tdbBtreeEncodePayload(SPage *pPage, u8 *pPayload, void *pKey, int kLen, void *pVal, int vLen,
|
||||||
u8 t[24]; // TODO
|
int *szPayload) {
|
||||||
u8 *ptr;
|
int nPayload;
|
||||||
|
|
||||||
|
ASSERT(pKey != NULL);
|
||||||
|
|
||||||
|
if (pVal == NULL) {
|
||||||
|
vLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nPayload = kLen + vLen;
|
||||||
|
if (nPayload <= pPage->maxLocal) {
|
||||||
|
// General case without overflow
|
||||||
|
memcpy(pPayload, pKey, kLen);
|
||||||
|
if (pVal) {
|
||||||
|
memcpy(pPayload + kLen, pVal, vLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
*szPayload = nPayload;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// TODO: handle overflow case
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int tdbBtreeEncodeCell(SPage *pPage, void *pKey, int kLen, void *pVal, int vLen, SCell *pCell, int *szCell) {
|
||||||
u16 flags;
|
u16 flags;
|
||||||
|
u8 leaf;
|
||||||
|
int nHeader;
|
||||||
|
int nPayload;
|
||||||
|
int ret;
|
||||||
|
|
||||||
ASSERT(pPage->kLen == TDB_VARIANT_LEN || pPage->kLen == kLen);
|
ASSERT(pPage->kLen == TDB_VARIANT_LEN || pPage->kLen == kLen);
|
||||||
ASSERT(pPage->vLen == TDB_VARIANT_LEN || pPage->vLen == vLen);
|
ASSERT(pPage->vLen == TDB_VARIANT_LEN || pPage->vLen == vLen);
|
||||||
|
|
||||||
ptr = t;
|
nPayload = 0;
|
||||||
|
nHeader = 0;
|
||||||
|
flags = TDB_PAGE_FLAGS(pPage);
|
||||||
|
leaf = TDB_BTREE_PAGE_IS_LEAF(flags);
|
||||||
|
|
||||||
// Encode kLen
|
// 1. Encode Header part
|
||||||
|
/* Encode kLen if need */
|
||||||
if (pPage->kLen == TDB_VARIANT_LEN) {
|
if (pPage->kLen == TDB_VARIANT_LEN) {
|
||||||
ptr += tdbPutVarInt(ptr, kLen);
|
nHeader += tdbPutVarInt(pCell + nHeader, kLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode vLen
|
/* Encode vLen if need */
|
||||||
if (pPage->vLen == TDB_VARIANT_LEN) {
|
if (pPage->vLen == TDB_VARIANT_LEN) {
|
||||||
ptr += tdbPutVarInt(ptr, vLen);
|
nHeader += tdbPutVarInt(pCell + nHeader, vLen);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Encode key-value
|
/* Encode SPgno if interior page */
|
||||||
if (TDB_BTREE_PAGE_IS_LEAF(flags)) {
|
if (!leaf) {
|
||||||
} else {
|
|
||||||
ASSERT(pPage->vLen == sizeof(SPgno));
|
ASSERT(pPage->vLen == sizeof(SPgno));
|
||||||
|
|
||||||
((SPgno *)ptr)[0] = ((SPgno *)pVal)[0];
|
((SPgno *)(pCell + nHeader))[0] = ((SPgno *)pVal)[0];
|
||||||
ptr = ptr + sizeof(SPgno);
|
nHeader = nHeader + sizeof(SPgno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 2. Encode payload part
|
||||||
|
if (leaf) {
|
||||||
|
ret = tdbBtreeEncodePayload(pPage, pCell + nHeader, pKey, kLen, pVal, vLen, &nPayload);
|
||||||
|
} else {
|
||||||
|
ret = tdbBtreeEncodePayload(pPage, pCell + nHeader, pKey, kLen, NULL, 0, &nPayload);
|
||||||
|
}
|
||||||
|
if (ret < 0) {
|
||||||
|
// TODO: handle error
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*szCell = nHeader + nPayload;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -60,8 +60,8 @@ struct SPage {
|
||||||
u8 *pFreeStart;
|
u8 *pFreeStart;
|
||||||
u8 *pFreeEnd;
|
u8 *pFreeEnd;
|
||||||
SPageFtr *pPageFtr;
|
SPageFtr *pPageFtr;
|
||||||
int kLen;
|
int kLen; // key length of the page, -1 for unknown
|
||||||
int vLen;
|
int vLen; // value length of the page, -1 for unknown
|
||||||
int nFree;
|
int nFree;
|
||||||
int maxLocal;
|
int maxLocal;
|
||||||
int minLocal;
|
int minLocal;
|
||||||
|
|
Loading…
Reference in New Issue