提交 15fa64eb 编写于 作者: H Hongze Cheng

more TDB

上级 9b8a8f12
......@@ -679,146 +679,65 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
// TODO: sort the page according to the page number
}
// { // Do the real cell distribution
// SPage *pTPage[2];
// int tPage, tIdx, iOld;
// SCell *pCell;
// int szCell;
// int nCells;
// SCellDecoder cd;
// SBtreeInitPageArg iarg = {.flags = TDB_BTREE_PAGE_GET_FLAGS(pOlds[0]), .pBt = pBt};
// for (int i = 0; i < 2; i++) {
// ret = tdbPageCreate(pOlds[0]->pageSize, &pTPage[i], NULL, NULL);
// if (ret < 0) {
// ASSERT(0);
// }
// }
// tPage = 0;
// tIdx = 0;
// iOld = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// if (childNotLeaf) {
// ((SIntHdr *)pTPage[tPage]->pData)->pgno = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// }
// for (int iNew = 0; iNew < nNews; iNew++) {
// // fill the iNew page
// // TODO: copy current page to tmp space
// tdbBtreeZeroPage(pNews[iNew], &iarg);
// for (int iCell = 0; iCell < infoNews[iNew].cnt; iCell++) {
// for (;;) { // loop to find the next available cell
// if (tIdx < nCells) {
// pCell = tdbPageGetCell(pTPage[tPage], tIdx);
// szCell = tdbBtreeCellSize(pTPage[tPage], pCell);
// tIdx++;
// break;
// } else {
// if (childNotLeaf) {
// if (iOld < nOlds - 1) {
// pCell = pDivCell[iOld];
// szCell = szDivCell[iOld];
// ((SPgno *)pCell)[0] = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// iOld++;
// tPage = (tPage + 1) % 2;
// tIdx = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// ((SIntHdr *)pTPage[tPage]->pData)->pgno = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// break;
// } else {
// iOld++;
// tPage = (tPage + 1) % 2;
// tIdx = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// ((SIntHdr *)pTPage[tPage]->pData)->pgno = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// }
// } else {
// iOld++;
// tPage = (tPage + 1) % 2;
// tIdx = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// }
// }
// }
// tdbPageInsertCell(pNews[iNew], iCell, pCell, szCell, 0);
// }
// // fill right-most child pgno if internal page
// if (childNotLeaf) {
// if (tIdx < nCells) {
// pCell = tdbPageGetCell(pTPage[tPage], tIdx);
// szCell = tdbBtreeCellSize(pTPage[tPage], pCell);
// tIdx++;
// break;
// } else {
// if (!childNotLeaf) {
// if (iOld < nOlds - 1) {
// pCell = pDivCell[iOld];
// szCell = szDivCell[iOld];
// ((SPgno *)pCell)[0] = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// iOld++;
// tPage = (tPage + 1) % 2;
// tIdx = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// ((SIntHdr *)pTPage[tPage]->pData)->pgno = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// break;
// } else {
// iOld++;
// tPage = (tPage + 1) % 2;
// tIdx = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// ((SIntHdr *)pTPage[tPage]->pData)->pgno = ((SIntHdr *)pOlds[iOld]->pData)->pgno;
// }
// } else {
// iOld++;
// tPage = (tPage + 1) % 2;
// tIdx = 0;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]);
// tdbBtreeZeroPage(pTPage[tPage], &iarg);
// tdbPageCopy(pOlds[iOld], pTPage[tPage]);
// }
// }
// ((SIntHdr *)pNews[iNew]->pData)->pgno = ((SPgno *)pCell)[0];
// }
// // insert divider cell into the parent page
// SIntHdr *pIntHdr = (SIntHdr *)pParent->pData;
// if (iNew == nNews - 1 && pIntHdr->pgno == 0) {
// pIntHdr->pgno = TDB_PAGE_PGNO(pNews[iNew]);
// } else {
// tdbBtreeDecodeCell(pNews[iNew], tdbPageGetCell(pNews[iNew], TDB_PAGE_TOTAL_CELLS(pNews[iNew]) - 1), &cd);
// tdbBtreeEncodeCell(pParent, cd.pKey, cd.kLen, (void *)&TDB_PAGE_PGNO(pNews[iNew]), sizeof(SPgno), pCell,
// &szCell);
// // TODO: the cell here may be used by pParent as an overflow cell
// tdbPageInsertCell(pParent, sIdx++, pCell, szCell, 0);
// }
// }
// for (int i = 0; i < 2; i++) {
// tdbPageDestroy(pTPage[i], NULL, NULL);
// }
}
{ // Do the real cell distribution
SPage *pOldsCopy[3];
SCell *pCell;
int szCell;
SBtreeInitPageArg iarg;
int iNew, nNewCells;
iarg.pBt = pBt;
iarg.flags = TDB_BTREE_PAGE_GET_FLAGS(pOlds[0]);
for (int i = 0; i < nOlds; i++) {
tdbPageCreate(pOlds[0]->pageSize, pOldsCopy + i, NULL, NULL);
tdbBtreeZeroPage(pOldsCopy[i], &iarg);
tdbPageCopy(pOlds[i], pOldsCopy[i]);
}
iNew = 0;
nNewCells = 0;
for (int iOld = 0; iOld < nOlds; iOld++) {
SPage *pPage;
pPage = pOldsCopy[iOld];
for (int oIdx = 0; oIdx < TDB_PAGE_TOTAL_CELLS(pPage); oIdx++) {
pCell = tdbPageGetCell(pPage, oIdx);
szCell = tdbBtreeCellSize(pPage, pCell);
ASSERT(nNewCells <= infoNews[iNew].cnt);
if (nNewCells < infoNews[iNew].cnt) {
tdbPageInsertCell(pNews[iNew], nNewCells, pCell, szCell, 0);
nNewCells++;
} else {
if (childNotLeaf) {
// set current new page right-most child
// move to next new page
} else {
// move to next new page
return 0;
// insert the cell to the new page
}
}
if (nNewCells == infoNews[iNew].cnt) {
if (childNotLeaf) {
// TODO
} else {
// TODO
}
}
}
}
for (int i = 0; i < nOlds; i++) {
tdbPageDestroy(pOldsCopy[i], NULL, NULL);
}
}
return 0;
}
static int tdbBtreeBalance(SBtCursor *pCur) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册