From cd103b8a50e02b82ea4e8e71b5ee71af6a843d47 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Sun, 6 Mar 2022 07:47:59 +0000 Subject: [PATCH] more TDB --- source/libs/tdb/src/db/tdbBtree.c | 79 ++++++++++++++++++++++++++++++- 1 file changed, 78 insertions(+), 1 deletion(-) diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index b796c32c22..c4f85f0535 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -402,4 +402,81 @@ static int tdbBtreeInitPage(SPage *pPage, void *arg) { } return 0; -} \ No newline at end of file +} + +#ifndef TDB_BTREE_BALANCE +static int tdbBtreeCopyPageContent(SPage *pFrom, SPage *pTo) { + /* TODO */ + + return 0; +} + +static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild) { + SPager *pPager; + SPage *pChild; + SPgno pgnoChild; + int ret; + SBtreeZeroPageArg zArg; + + pPager = pRoot->pPager; + + // Allocate a new child page + zArg.flags = TDB_BTREE_LEAF; + zArg.pBt = pBt; + ret = tdbPagerNewPage(pPager, &pgnoChild, &pChild, tdbBtreeZeroPage, &zArg); + if (ret < 0) { + return -1; + } + + // Copy the root page content to the child page + ret = tdbBtreeCopyPageContent(pRoot, pChild); + if (ret < 0) { + return -1; + } + + { + // TODO: Copy the over flow part of the page + } + + // Reinitialize the root page + zArg.flags = TDB_BTREE_ROOT; + zArg.pBt = pBt; + ret = tdbBtreeZeroPage(pRoot, &zArg); + if (ret < 0) { + return -1; + } + + return 0; +} + +static int tdbBtreeBalance(SBtCursor *pCur) { + int iPage; + SPage *pPage; + + // Main loop to balance the BTree + for (;;) { + iPage = pCur->iPage; + pPage = pCur->pPage; + + // TODO: Get the page free space if not get yet + // if (pPage->nFree < 0) { + // if (tdbBtreeComputeFreeSpace(pPage) < 0) { + // return -1; + // } + // } + + if (0 /*TODO: balance is over*/) { + break; + } + + if (iPage == 0) { + // Balance the root page + ASSERT(TDB_BTREE_PAGE_IS_ROOT(pPage->pPageHdr->flags)); + + } else { + } + } + + return 0; +} +#endif \ No newline at end of file