more TDB
This commit is contained in:
parent
cc176b1037
commit
07f6d03a52
|
@ -131,15 +131,6 @@ int tdbBtreeClose(SBTree *pBt) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbBtcOpen(SBTC *pCur, SBTree *pBt) {
|
|
||||||
pCur->pBt = pBt;
|
|
||||||
pCur->iPage = -1;
|
|
||||||
pCur->pPage = NULL;
|
|
||||||
pCur->idx = -1;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tdbBtCursorInsert(SBTC *pCur, const void *pKey, int kLen, const void *pVal, int vLen) {
|
int tdbBtCursorInsert(SBTC *pCur, const void *pKey, int kLen, const void *pVal, int vLen) {
|
||||||
int ret;
|
int ret;
|
||||||
int idx;
|
int idx;
|
||||||
|
@ -1073,13 +1064,107 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell) {
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int tdbBtcOpen(SBTC *pCur, SBTree *pBt) {
|
||||||
|
pCur->pBt = pBt;
|
||||||
|
pCur->iPage = -1;
|
||||||
|
pCur->pPage = NULL;
|
||||||
|
pCur->idx = -1;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int tdbBtcMoveToFirst(SBTC *pBtc) {
|
int tdbBtcMoveToFirst(SBTC *pBtc) {
|
||||||
// TODO
|
int ret;
|
||||||
|
SBTree *pBt;
|
||||||
|
SPager *pPager;
|
||||||
|
u8 flags;
|
||||||
|
SCell *pCell;
|
||||||
|
SPgno pgno;
|
||||||
|
|
||||||
|
pBt = pBtc->pBt;
|
||||||
|
pPager = pBt->pPager;
|
||||||
|
|
||||||
|
if (pBtc->iPage < 0) {
|
||||||
|
// move a clean cursor
|
||||||
|
ret = tdbPagerFetchPage(pPager, pBt->root, &(pBtc->pPage), tdbBtreeInitPage, pBt);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBtc->iPage = 0;
|
||||||
|
pBtc->idx = 0;
|
||||||
|
} else {
|
||||||
|
// move from a position
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move downward
|
||||||
|
for (;;) {
|
||||||
|
flags = TDB_BTREE_PAGE_GET_FLAGS(pBtc->pPage);
|
||||||
|
|
||||||
|
if (TDB_BTREE_PAGE_IS_LEAF(flags)) break;
|
||||||
|
|
||||||
|
pCell = tdbPageGetCell(pBtc->pPage, 0);
|
||||||
|
pgno = *(SPgno *)pCell;
|
||||||
|
|
||||||
|
ret = tdbBtCursorMoveToChild(pBtc, pgno);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBtc->idx = 0;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int tdbBtcMoveToLast(SBTC *pBtc) {
|
int tdbBtcMoveToLast(SBTC *pBtc) {
|
||||||
// TODO
|
int ret;
|
||||||
|
SBTree *pBt;
|
||||||
|
SPager *pPager;
|
||||||
|
u8 flags;
|
||||||
|
SPgno pgno;
|
||||||
|
|
||||||
|
pBt = pBtc->pBt;
|
||||||
|
pPager = pBt->pPager;
|
||||||
|
|
||||||
|
if (pBtc->iPage < 0) {
|
||||||
|
// move a clean cursor
|
||||||
|
ret = tdbPagerFetchPage(pPager, pBt->root, &(pBtc->pPage), tdbBtreeInitPage, pBt);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
pBtc->iPage = 0;
|
||||||
|
} else {
|
||||||
|
// move from a position
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
// move downward
|
||||||
|
for (;;) {
|
||||||
|
flags = TDB_BTREE_PAGE_GET_FLAGS(pBtc->pPage);
|
||||||
|
|
||||||
|
if (TDB_BTREE_PAGE_IS_LEAF(flags)) {
|
||||||
|
// TODO: handle empty case
|
||||||
|
ASSERT(TDB_PAGE_TOTAL_CELLS(pBtc->pPage) > 0);
|
||||||
|
pBtc->idx = TDB_PAGE_TOTAL_CELLS(pBtc->pPage) - 1;
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
pBtc->idx = TDB_PAGE_TOTAL_CELLS(pBtc->pPage);
|
||||||
|
pgno = ((SIntHdr *)pBtc->pPage->pData)->pgno;
|
||||||
|
|
||||||
|
ret = tdbBtCursorMoveToChild(pBtc, pgno);
|
||||||
|
if (ret < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue