From b8e346a3f5988c02af81cd87304c8627035fa2ff Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 25 Feb 2022 07:03:36 +0000 Subject: [PATCH] more TDB --- source/libs/tdb/src/db/tdbBtree.c | 98 ++++++++++++++++++++++++------ source/libs/tdb/src/db/tdbPFile.c | 12 ++++ source/libs/tdb/src/inc/tdbBtree.h | 2 + source/libs/tdb/src/inc/tdbInt.h | 2 +- source/libs/tdb/src/inc/tdbPFile.h | 2 + 5 files changed, 97 insertions(+), 19 deletions(-) diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 574a83f486..b239a58ca8 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -25,18 +25,29 @@ struct SBTree { int (*FKeyComparator)(const void *pKey1, int keyLen1, const void *pKey2, int keyLen2); }; +typedef struct SPgHdr { + u8 flags; + u8 nFree; + u16 firstFree; + u16 nCells; + u16 pCell; + i32 kLen; + i32 vLen; +} SPgHdr; + +typedef struct SBtPage { + SPgHdr *pHdr; + u16 * aCellIdx; +} SBtPage; + struct SBtCursor { - SBTree * pBt; - i8 iPage; - // SMemPage *pPage; - // SMemPage *apPage[BTREE_MAX_DEPTH + 1]; + SBTree * pBt; + i8 iPage; + SBtPage *pPage; }; -// typedef struct SMemPage { -// u8 isInit; -// u8 isLeaf; -// SPgno pgno; -// } SMemPage; +static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen); +static int tdbEncodeLength(u8 *pBuf, uint len); int tdbBtreeOpen(SPgno root, SBTree **ppBt) { *ppBt = NULL; @@ -56,21 +67,72 @@ int tdbBtreeCursor(SBTree *pBt, SBtCursor *pCur) { return 0; } -int tdbBtreeCursorMoveTo(SBtCursor *pCur) { - /* TODO */ +int tdbBtCursorInsert(SBtCursor *pCur, const void *pKey, int kLen, const void *pVal, int vLen) { + int ret; + SPFile *pFile; + + ret = tdbBtCursorMoveTo(pCur, pKey, kLen); + if (ret < 0) { + // TODO: handle error + return -1; + } + + pFile = pCur->pBt->pFile; + // ret = tdbPFileWrite(pFile, pCur->pPage); + // if (ret < 0) { + // // TODO: handle error + // return -1; + // } + return 0; } -static int tdbBtreeCursorMoveToRoot(SBtCursor *pCur) { - SPFile *pFile; - SPage * pPage; +static int tdbBtCursorMoveTo(SBtCursor *pCur, const void *pKey, int kLen) { + // TODO + return 0; +} - pFile = pCur->pBt->pFile; +static int tdbEncodeKeyValue(const void *pKey, int kLen, int kLenG, const void *pVal, int vLen, int vLenG, void *pBuf, + int *bLen) { + u8 *pPtr; - pPage = tdbPFileGet(pFile, pCur->pBt->root); - if (pPage == NULL) { - return -1; + ASSERT(kLen > 0 && vLen > 0); + ASSERT(kLenG == TDB_VARIANT_LEN || kLenG == kLen); + ASSERT(vLenG == TDB_VARIANT_LEN || vLenG == vLen); + + pPtr = (u8 *)pBuf; + if (kLenG == TDB_VARIANT_LEN) { + pPtr += tdbEncodeLength(pPtr, kLen); + } + + if (vLenG == TDB_VARIANT_LEN) { + pPtr += tdbEncodeLength(pPtr, vLen); } + memcpy(pPtr, pKey, kLen); + pPtr += kLen; + + memcpy(pPtr, pVal, vLen); + pPtr += vLen; + + *bLen = pPtr - (u8 *)pBuf; return 0; +} + +static int tdbDecodeKeyValue(const void *pBuf, void *pKey, int *kLen, void *pVal, int *vLen) { + // TODO + return 0; +} + +static int tdbEncodeLength(u8 *pBuf, uint len) { + int iCount = 0; + + while (len > 127) { + pBuf[iCount++] = (u8)((len & 0xff) | 128); + len >>= 7; + } + + pBuf[iCount++] = (u8)len; + + return iCount; } \ No newline at end of file diff --git a/source/libs/tdb/src/db/tdbPFile.c b/source/libs/tdb/src/db/tdbPFile.c index 01b1eddc35..16f219d95a 100644 --- a/source/libs/tdb/src/db/tdbPFile.c +++ b/source/libs/tdb/src/db/tdbPFile.c @@ -105,6 +105,18 @@ SPage *tdbPFileGet(SPFile *pFile, SPgno pgno) { return pPage; } +int tdbPFileWrite(SPFile *pFile, SPage *pPage) { + // TODO: if the page is not in journal, write to journal + // mark the page as dirty + return 0; +} + +int tdbPFileAllocPage(SPFile *pFile, SPage **ppPage) { + // TODO + *ppPage = NULL; + return 0; +} + int tdbPFileBegin(SPFile *pFile) { // TODO return 0; diff --git a/source/libs/tdb/src/inc/tdbBtree.h b/source/libs/tdb/src/inc/tdbBtree.h index 757525d6a7..a2890b4cd4 100644 --- a/source/libs/tdb/src/inc/tdbBtree.h +++ b/source/libs/tdb/src/inc/tdbBtree.h @@ -23,6 +23,8 @@ extern "C" { typedef struct SBTree SBTree; typedef struct SBtCursor SBtCursor; +int tdbBtCursorInsert(SBtCursor *pCur, const void *pKey, int kLen, const void *pVal, int vLen); + #ifdef __cplusplus } #endif diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index e927cae9d6..84b199c42b 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -108,7 +108,7 @@ typedef TD_DLIST_NODE(SPgFile) SPgFileListNode; } \ } while (0) -#define TDB_VARIANT_LEN (int)-1 +#define TDB_VARIANT_LEN ((int)-1) // page payload format // + + [key] + [value] diff --git a/source/libs/tdb/src/inc/tdbPFile.h b/source/libs/tdb/src/inc/tdbPFile.h index ba277388c1..83f18fdca0 100644 --- a/source/libs/tdb/src/inc/tdbPFile.h +++ b/source/libs/tdb/src/inc/tdbPFile.h @@ -25,6 +25,8 @@ typedef struct SPFile SPFile; int tdbPFileOpen(SPCache *pCache, const char *fileName, SPFile **ppFile); int tdbPFileClose(SPFile *pFile); SPage *tdbPFileGet(SPFile *pFile, SPgno pgno); +int tdbPFileWrite(SPFile *pFile, SPage *pPage); +int tdbPFileAllocPage(SPFile *pFile, SPage **ppPage); int tdbPFileBegin(SPFile *pFile); int tdbPFileCommit(SPFile *pFile); int tdbPFileRollback(SPFile *pFile); -- GitLab