more TDB
This commit is contained in:
parent
99f16075cb
commit
7e6e005db9
|
@ -734,4 +734,92 @@ static int tdbBtreeBalance(SBtCursor *pCur) {
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef TDB_BTREE_CELL
|
||||
typedef struct {
|
||||
} SCellEncoder;
|
||||
|
||||
typedef struct {
|
||||
int kLen;
|
||||
u8 *pKey;
|
||||
int vLen;
|
||||
u8 *pVal;
|
||||
u8 kOverflow;
|
||||
u8 vOverflow;
|
||||
u8 *pTmpSpace;
|
||||
} SCellDecoder;
|
||||
|
||||
static int tdbBtreeEncodeCell(SPage *pPage, void *pKey, int kLen, void *pVal, int vLen) {
|
||||
u8 t[24]; // TODO
|
||||
u8 *ptr;
|
||||
u16 flags;
|
||||
|
||||
ASSERT(pPage->kLen == TDB_VARIANT_LEN || pPage->kLen == kLen);
|
||||
ASSERT(pPage->vLen == TDB_VARIANT_LEN || pPage->vLen == vLen);
|
||||
|
||||
ptr = t;
|
||||
|
||||
// Encode kLen
|
||||
if (pPage->kLen == TDB_VARIANT_LEN) {
|
||||
ptr += tdbPutVarInt(ptr, kLen);
|
||||
}
|
||||
|
||||
// Encode vLen
|
||||
if (pPage->vLen == TDB_VARIANT_LEN) {
|
||||
ptr += tdbPutVarInt(ptr, vLen);
|
||||
}
|
||||
|
||||
// Encode key-value
|
||||
if (TDB_BTREE_PAGE_IS_LEAF(flags)) {
|
||||
} else {
|
||||
ASSERT(pPage->vLen == sizeof(SPgno));
|
||||
|
||||
((SPgno *)ptr)[0] = ((SPgno *)pVal)[0];
|
||||
ptr = ptr + sizeof(SPgno);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int tdbBtreeDecodeCell(SPage *pPage, SCell *pCell, SCellDecoder *pDecoder) {
|
||||
u16 flags;
|
||||
|
||||
// Decode kLen
|
||||
if (pPage->kLen != -1) {
|
||||
pDecoder->vLen = pPage->kLen;
|
||||
} else {
|
||||
pCell += tdbGetVarInt(pCell, &pDecoder->kLen);
|
||||
}
|
||||
|
||||
// Decode vLen
|
||||
if (pPage->vLen != -1) {
|
||||
pDecoder->vLen = pPage->vLen;
|
||||
} else {
|
||||
pCell += tdbGetVarInt(pCell, &(pDecoder->vLen));
|
||||
}
|
||||
|
||||
flags = TDB_PAGE_FLAGS(pPage);
|
||||
if (TDB_BTREE_PAGE_IS_LEAF(flags)) {
|
||||
// For leaf page
|
||||
// TODO
|
||||
} else {
|
||||
// For interior page
|
||||
ASSERT(pDecoder->vLen == sizeof(SPgno));
|
||||
|
||||
pDecoder->pVal = pCell;
|
||||
pDecoder->kOverflow = 0;
|
||||
pCell = pCell + pPage->vLen;
|
||||
|
||||
pDecoder->pKey = pCell;
|
||||
if (0) {
|
||||
pDecoder->vOverflow = 1;
|
||||
} else {
|
||||
pDecoder->vOverflow = 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
|
@ -39,6 +39,44 @@ int tdbGetFileSize(const char *fname, int pgSize, SPgno *pSize);
|
|||
|
||||
int tdbPRead(int fd, void *pData, int count, i64 offset);
|
||||
|
||||
static inline int tdbPutVarInt(u8 *p, int v) {
|
||||
int n = 0;
|
||||
|
||||
for (;;) {
|
||||
if (v < 0xff) {
|
||||
p[n++] = v;
|
||||
break;
|
||||
}
|
||||
|
||||
p[n++] = (v & 0x7f) | 0x80;
|
||||
v >>= 7;
|
||||
}
|
||||
|
||||
ASSERT(n < 6);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static inline int tdbGetVarInt(const u8 *p, int *v) {
|
||||
int n = 0;
|
||||
int tv = 0;
|
||||
|
||||
for (;;) {
|
||||
if (p[n] & 0x80 == 0) {
|
||||
tv = (tv << 7) & p[n];
|
||||
n++;
|
||||
break;
|
||||
}
|
||||
|
||||
tv = (tv << 7) & (p[n] & 0x7f);
|
||||
n++;
|
||||
}
|
||||
|
||||
ASSERT(n < 6);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
|
Loading…
Reference in New Issue