提交 f9c09351 编写于 作者: H Hongze Cheng

more TDB

上级 546bf6ac
......@@ -450,15 +450,102 @@ static int tdbBtreeBalanceDeeper(SBTree *pBt, SPage *pRoot, SPage **ppChild) {
return 0;
}
static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx, bool isRoot) {
static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
int nOldPages;
SPage *pOldPages[3];
int nNewPages;
SPage *pNewPages[5];
void *pCell;
SPgno pgno;
int i;
int nDiv;
int ret;
SPage *pPage;
void *pCellDiv[2];
// Find three or less sibling pages
{
// TODO: Find three or less sibling pages on either side
i = pParent->pPageHdr->nCells + pParent->nOverflow;
if (i < 1) {
nDiv = 0;
} else {
if (idx == 0) {
nDiv = 0;
} else if (idx == i) {
nDiv = i - 2;
} else {
nDiv = idx - 1;
}
i = 2;
}
nOldPages = i + 1;
if (i + nDiv - pParent->nOverflow == pParent->pPageHdr->nCells) {
pgno = pParent->pPageHdr->rChild;
} else {
ASSERT(0);
// TODO
pgno = 0;
}
for (;;) {
ret = tdbPagerFetchPage(pBt->pPager, pgno, &pPage, tdbBtreeInitPage, pBt);
if (ret < 0) {
ASSERT(0);
return -1;
}
pOldPages[i] = pPage;
if ((i--) == 0) break;
if (pParent->nOverflow && i + nDiv == pParent->aiOvfl[0]) {
pCellDiv[i] = pParent->apOvfl[0];
// pgno = 0;
// szNew[i] = tdbPageCellSize(pPage, pCell);
pParent->nOverflow = 0;
} else {
// pCellDiv[i] = TDB_PAGE_CELL_AT(pPage, i + nDiv - pParent->nOverflow);
// pgno = 0;
// szNew[i] = tdbPageCellSize(pPage, pCell);
// Drop the cell from the page
// ret = tdbPageDropCell(pPage, i + nDiv - pParent->nOverflow, szNew[i]);
// if (ret < 0) {
// return -1;
// }
}
/* code */
}
}
{
// TODO: Load all cells on the old page and the divider cells
}
{
// TODO: Get the number of pages needed to hold all cells
}
{
// TODO: Allocate enough new pages. Reuse old pages as much as possible
}
{
// TODO: Insert new divider cells into pParent
}
{
// TODO: Update the sibling pages
}
{
// TODO: Reset states
}
{
// TODO: Clear resources
}
/* TODO */
return 0;
}
......@@ -502,7 +589,7 @@ static int tdbBtreeBalance(SBtCursor *pCur) {
// Generalized balance step
pParent = pCur->pgStack[pCur->iPage - 1];
ret = tdbBtreeBalanceNonRoot(pCur->pBt, pParent, pCur->idxStack[pCur->iPage - 1], (iPage == 1));
ret = tdbBtreeBalanceNonRoot(pCur->pBt, pParent, pCur->idxStack[pCur->iPage - 1]);
if (ret < 0) {
return -1;
}
......
......@@ -21,11 +21,12 @@ extern "C" {
#endif
typedef struct __attribute__((__packed__)) {
u16 flags;
u16 nCells;
u16 cellCont;
u16 freeCell;
u16 nFree;
u16 flags;
u16 nCells;
u16 cellCont;
u16 freeCell;
u16 nFree;
SPgno rChild;
} SPageHdr;
typedef struct SPage SPage;
......@@ -53,6 +54,8 @@ struct SPage {
int maxLocal;
int minLocal;
int nOverflow;
void *apOvfl[4];
int aiOvfl[4];
};
// For page lock
......@@ -80,13 +83,13 @@ struct SPage {
// For page ref
#define TDB_INIT_PAGE_REF(pPage) ((pPage)->nRef = 0)
#if 0
#define TDB_REF_PAGE(pPage) (++(pPage)->nRef)
#define TDB_UNREF_PAGE(pPage) (--(pPage)->nRef)
#define TDB_GET_PAGE_REF(pPage) ((pPage)->nRef)
#define TDB_REF_PAGE(pPage) (++(pPage)->nRef)
#define TDB_UNREF_PAGE(pPage) (--(pPage)->nRef)
#define TDB_GET_PAGE_REF(pPage) ((pPage)->nRef)
#else
#define TDB_REF_PAGE(pPage) atomic_add_fetch_32(&((pPage)->nRef), 1)
#define TDB_UNREF_PAGE(pPage) atomic_sub_fetch_32(&((pPage)->nRef), 1)
#define TDB_GET_PAGE_REF(pPage) atomic_load_32(&((pPage)->nRef))
#define TDB_REF_PAGE(pPage) atomic_add_fetch_32(&((pPage)->nRef), 1)
#define TDB_UNREF_PAGE(pPage) atomic_sub_fetch_32(&((pPage)->nRef), 1)
#define TDB_GET_PAGE_REF(pPage) atomic_load_32(&((pPage)->nRef))
#endif
#ifdef __cplusplus
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册