This commit is contained in:
Hongze Cheng 2022-03-23 07:39:57 +00:00
parent 9b8a8f1287
commit 15fa64ebaa
1 changed files with 48 additions and 129 deletions

View File

@ -679,146 +679,65 @@ static int tdbBtreeBalanceNonRoot(SBTree *pBt, SPage *pParent, int idx) {
// TODO: sort the page according to the page number // TODO: sort the page according to the page number
} }
// { // Do the real cell distribution { // Do the real cell distribution
SPage *pOldsCopy[3];
SCell *pCell;
int szCell;
SBtreeInitPageArg iarg;
int iNew, nNewCells;
// SPage *pTPage[2]; iarg.pBt = pBt;
// int tPage, tIdx, iOld; iarg.flags = TDB_BTREE_PAGE_GET_FLAGS(pOlds[0]);
// SCell *pCell; for (int i = 0; i < nOlds; i++) {
// int szCell; tdbPageCreate(pOlds[0]->pageSize, pOldsCopy + i, NULL, NULL);
// int nCells; tdbBtreeZeroPage(pOldsCopy[i], &iarg);
// SCellDecoder cd; tdbPageCopy(pOlds[i], pOldsCopy[i]);
// SBtreeInitPageArg iarg = {.flags = TDB_BTREE_PAGE_GET_FLAGS(pOlds[0]), .pBt = pBt}; }
iNew = 0;
nNewCells = 0;
// for (int i = 0; i < 2; i++) { for (int iOld = 0; iOld < nOlds; iOld++) {
// ret = tdbPageCreate(pOlds[0]->pageSize, &pTPage[i], NULL, NULL); SPage *pPage;
// if (ret < 0) {
// ASSERT(0);
// }
// }
// tPage = 0; pPage = pOldsCopy[iOld];
// 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++) { for (int oIdx = 0; oIdx < TDB_PAGE_TOTAL_CELLS(pPage); oIdx++) {
// // fill the iNew page pCell = tdbPageGetCell(pPage, oIdx);
// // TODO: copy current page to tmp space szCell = tdbBtreeCellSize(pPage, pCell);
// tdbBtreeZeroPage(pNews[iNew], &iarg);
// for (int iCell = 0; iCell < infoNews[iNew].cnt; iCell++) { ASSERT(nNewCells <= infoNews[iNew].cnt);
// 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++; if (nNewCells < infoNews[iNew].cnt) {
// tPage = (tPage + 1) % 2; tdbPageInsertCell(pNews[iNew], nNewCells, pCell, szCell, 0);
// tIdx = 0; nNewCells++;
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]); } else {
// tdbBtreeZeroPage(pTPage[tPage], &iarg); if (childNotLeaf) {
// tdbPageCopy(pOlds[iOld], pTPage[tPage]); // set current new page right-most child
// ((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); // move to next new page
// } } else {
// move to next new page
// // fill right-most child pgno if internal page // insert the cell to the new 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++; if (nNewCells == infoNews[iNew].cnt) {
// tPage = (tPage + 1) % 2; if (childNotLeaf) {
// tIdx = 0; // TODO
// nCells = TDB_PAGE_TOTAL_CELLS(pOlds[iOld]); } else {
// tdbBtreeZeroPage(pTPage[tPage], &iarg); // TODO
// 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]; for (int i = 0; i < nOlds; i++) {
// } tdbPageDestroy(pOldsCopy[i], NULL, NULL);
}
}
// // insert divider cell into the parent page return 0;
// 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);
// }
}
return 0;
} }
static int tdbBtreeBalance(SBtCursor *pCur) { static int tdbBtreeBalance(SBtCursor *pCur) {