From 21cec7b6d79ebcb21cd7ff3adc4500123e3f2443 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 29 Apr 2022 07:07:49 +0000 Subject: [PATCH] more --- source/libs/tdb/inc/tdb.h | 9 +- source/libs/tdb/src/db/tdbBtree.c | 131 ++++++++++++++++++------------ source/libs/tdb/src/db/tdbDb.c | 7 +- source/libs/tdb/src/inc/tdbInt.h | 2 +- 4 files changed, 86 insertions(+), 63 deletions(-) diff --git a/source/libs/tdb/inc/tdb.h b/source/libs/tdb/inc/tdb.h index 100e7a2a20..9318e4655b 100644 --- a/source/libs/tdb/inc/tdb.h +++ b/source/libs/tdb/inc/tdb.h @@ -45,13 +45,12 @@ int tdbDbGet(TDB *pDb, const void *pKey, int kLen, void **ppVal, int *vLen); int tdbDbPGet(TDB *pDb, const void *pKey, int kLen, void **ppKey, int *pkLen, void **ppVal, int *vLen); // TDBC -#define TDB_FLG_BACKWD 0x1 // backward search -#define TDB_FLG_CMP_LT 0x2 // less than -#define TDB_FLG_CMP_EQ 0x4 // equal -#define TDB_FLG_CMP_GT 0x8 // greater than +#define TDB_FLG_CMP_LT 0x1 // less than +#define TDB_FLG_CMP_EQ 0x2 // equal +#define TDB_FLG_CMP_GT 0x4 // greater than int tdbDbcOpen(TDB *pDb, TDBC **ppDbc, TXN *pTxn); -int tdbDbcMoveTo(TDBC *pDbc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, int flags); +int tdbDbcMoveTo(TDBC *pDbc, const void *pKey, int kLen, int flags); int tdbDbcPut(TDBC *pDbc, const void *pKey, int keyLen, const void *pVal, int valLen); int tdbDbcUpdate(TDBC *pDbc, const void *pKey, int kLen, const void *pVal, int vLen); int tdbDbcDrop(TDBC *pDbc); diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 4e9e630b3e..83d89617bb 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -1506,20 +1506,45 @@ void tdbBtPageInfo(SPage *pPage, int idx) { #endif // TDB_BTREE_DEBUG -int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, int flags) { - SBTree *pBt = pBtc->pBt; - SPager *pPager = pBt->pPager; - SPgno root = pBt->root; - SCellDecoder cd = {0}; - int nCells = 0; - SCell *pCell = NULL; - int ret = 0; - int c; - int backward = flags & TDB_FLG_BACKWD; - - if (cmprFn == NULL) { - cmprFn = pBt->kcmpr; +static void tdbBSearch(int *lidx, int *ridx, int midx, int c, int flags) { + if (flags & TDB_FLG_CMP_EQ) { + if (c < 0) { + *lidx = midx + 1; + } else if (c == 0) { + *lidx = *ridx + 1; + } else { + *ridx = midx - 1; + } + } else if (flags & TDB_FLG_CMP_GT) { + if (c <= 0) { + *lidx = midx + 1; + } else { + *ridx = midx - 1; + } + } else if (flags & TDB_FLG_CMP_LT) { + if (c < 0) { + *lidx = midx + 1; + } else { + *ridx = midx - 1; + } + } else { + ASSERT(0); } +} + +int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, int flags) { + SBTree *pBt = pBtc->pBt; + SPager *pPager = pBt->pPager; + SPgno root = pBt->root; + SCellDecoder cd = {0}; + int nCells = 0; + SCell *pCell = NULL; + int ret = 0; + int c; + u8 leaf; + tdb_cmpr_fn_t cmprFn; + + cmprFn = pBt->kcmpr; // move cursor to a level if (pBtc->iPage < 0) { @@ -1538,6 +1563,7 @@ int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, if (TDB_PAGE_TOTAL_CELLS(pBtc->pPage) == 0) return 0; } else { // move from a position (TODO) + ASSERT(0); } // search downward @@ -1553,28 +1579,21 @@ int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, ASSERT(nCells > 0); ASSERT(pBtc->idx == -1); + // search two ends // compare first cell midx = lidx; pCell = tdbPageGetCell(pPage, midx); tdbBtreeDecodeCell(pPage, pCell, &cd); - c = cmprFn(pKey, kLen, cd.pKey, cd.kLen); - if (c <= 0) { - ridx = lidx - 1; - } else { - lidx = lidx + 1; - } + c = cmprFn(cd.pKey, cd.kLen, pKey, kLen); + tdbBSearch(&lidx, &ridx, midx, c, flags); // compare last cell if (lidx <= ridx) { midx = ridx; pCell = tdbPageGetCell(pPage, midx); tdbBtreeDecodeCell(pPage, pCell, &cd); - c = cmprFn(pKey, kLen, cd.pKey, cd.kLen); - if (c >= 0) { - lidx = ridx + 1; - } else { - ridx = ridx - 1; - } + c = cmprFn(cd.pKey, cd.kLen, pKey, kLen); + tdbBSearch(&lidx, &ridx, midx, c, flags); } // binary search @@ -1582,41 +1601,47 @@ int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, if (lidx > ridx) break; midx = (lidx + ridx) >> 1; - pCell = tdbPageGetCell(pPage, midx); - ret = tdbBtreeDecodeCell(pPage, pCell, &cd); - if (ret < 0) { - // TODO: handle error - ASSERT(0); - return -1; - } - - // Compare the key values + tdbBtreeDecodeCell(pPage, pCell, &cd); c = cmprFn(pKey, kLen, cd.pKey, cd.kLen); - if (c < 0) { - // pKey < cd.pKey - ridx = midx - 1; - } else if (c > 0) { - // pKey > cd.pKey - lidx = midx + 1; - } else { - // pKey == cd.pKey - break; - } + tdbBSearch(&lidx, &ridx, midx, c, flags); } // keep search downward or break - if (TDB_BTREE_PAGE_IS_LEAF(pPage)) { - pBtc->idx = midx; - // *pCRst = c; - break; - } else { - if (c <= 0) { - pBtc->idx = midx; - } else { - pBtc->idx = midx + 1; + leaf = TDB_BTREE_PAGE_IS_LEAF(pPage); + if (!leaf) { + if (flags & 0x7 == TDB_FLG_CMP_EQ) { + if (c < 0) { + pBtc->idx = midx + 1; + } else { + pBtc->idx = midx; + } + } else if (flags & 0x7 == TDB_FLG_CMP_LT) { + if (c < 0) { + pBtc->idx = midx; + } else if (c == 0) { + } else { + } + } else if (flags & 0x7 == TDB_FLG_CMP_GT) { + if (c < 0) { + } else if (c == 0) { + } else { + } + } else if (flags & 0x7 == TDB_FLG_CMP_LT | TDB_FLG_CMP_EQ) { + if (c < 0) { + } else if (c == 0) { + } else { + } + } else if (flags & 0x7 == TDB_FLG_CMP_GT | TDB_FLG_CMP_EQ) { + if (c < 0) { + } else if (c == 0) { + } else { + } } + tdbBtcMoveDownward(pBtc); + } else { + // non-leaf (TODO) } } diff --git a/source/libs/tdb/src/db/tdbDb.c b/source/libs/tdb/src/db/tdbDb.c index 70237cf113..e89c39053c 100644 --- a/source/libs/tdb/src/db/tdbDb.c +++ b/source/libs/tdb/src/db/tdbDb.c @@ -111,18 +111,17 @@ int tdbDbcOpen(TDB *pDb, TDBC **ppDbc, TXN *pTxn) { return 0; } -int tdbDbcMoveTo(TDBC *pDbc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, int flags) { +int tdbDbcMoveTo(TDBC *pDbc, const void *pKey, int kLen, int flags) { int tflags; // set/check flags if (flags == 0) { flags |= TDB_FLG_CMP_EQ; } else { - tflags = flags & (TDB_FLG_CMP_LT | TDB_FLG_CMP_EQ | TDB_FLG_CMP_GT); - if (tflags != TDB_FLG_CMP_LT && tflags != TDB_FLG_CMP_EQ && tflags != TDB_FLG_CMP_GT) return -1; + if (flags & TDB_FLG_CMP_LT && flags & TDB_FLG_CMP_GT) return -1; } - return tdbBtcMoveTo2(&pDbc->btc, pKey, kLen, cmprFn, flags); + return tdbBtcMoveTo2(&pDbc->btc, pKey, kLen, flags); } int tdbDbcPut(TDBC *pDbc, const void *pKey, int keyLen, const void *pVal, int valLen) { diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index 64c842a037..eaf1f9d988 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -123,7 +123,7 @@ int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkL // SBTC int tdbBtcOpen(SBTC *pBtc, SBTree *pBt, TXN *pTxn); -int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, tdb_cmpr_fn_t cmprFn, int flags); +int tdbBtcMoveTo2(SBTC *pBtc, const void *pKey, int kLen, int flags); int tdbBtcMoveToFirst(SBTC *pBtc); int tdbBtcMoveToLast(SBTC *pBtc); int tdbBtreeNext(SBTC *pBtc, void **ppKey, int *kLen, void **ppVal, int *vLen); -- GitLab