diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index c92a1bdbb6..b9da7ef3ec 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -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 \ No newline at end of file diff --git a/source/libs/tdb/src/inc/tdbUtil.h b/source/libs/tdb/src/inc/tdbUtil.h index 7b190374a1..9e23ca9419 100644 --- a/source/libs/tdb/src/inc/tdbUtil.h +++ b/source/libs/tdb/src/inc/tdbUtil.h @@ -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