⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dbtuppagemap.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	regPRPtr.i = parentPtr;	ptrCheckGuard(regPRPtr, cnoOfPageRangeRec, pageRange);	continue;      }//if      ljam();      ndbrequire(regPRPtr.i == regFragPtr->rootPageRange);      initFragRange(regFragPtr);      return;    } else {      if (regPRPtr.p->type[indexPos] == ZNON_LEAF) {        jam();	/* ---------------------------------------------------------------- */	// A non-leaf node, we must release everything below it before we 	// release this node.	/* ---------------------------------------------------------------- */        regPRPtr.i = basePageId;        ptrCheckGuard(regPRPtr, cnoOfPageRangeRec, pageRange);      } else {        jam();        ndbrequire(regPRPtr.p->type[indexPos] == ZLEAF);	/* ---------------------------------------------------------------- */	/* PAGE_RANGE_PTR /= RNIL AND THE CURRENT POS IS NOT A CHLED.       */	/*----------------------------------------------------------------- */	const Uint32 start = regPRPtr.p->startRange[indexPos];	const Uint32 stop = regPRPtr.p->endRange[indexPos];	ndbrequire(stop >= start);	const Uint32 retNo = (stop - start + 1);	returnCommonArea(basePageId, retNo);      }//if    }//if  }//while}//Dbtup::releaseFragPages()void Dbtup::initializePageRange() {  PageRangePtr regPTRPtr;  for (regPTRPtr.i = 0;       regPTRPtr.i < cnoOfPageRangeRec; regPTRPtr.i++) {    ptrAss(regPTRPtr, pageRange);    regPTRPtr.p->nextFree = regPTRPtr.i + 1;  }//for  regPTRPtr.i = cnoOfPageRangeRec - 1;  ptrAss(regPTRPtr, pageRange);  regPTRPtr.p->nextFree = RNIL;  cfirstfreerange = 0;  c_noOfFreePageRanges = cnoOfPageRangeRec;}//Dbtup::initializePageRange()void Dbtup::initFragRange(Fragrecord* const regFragPtr){  regFragPtr->emptyPrimPage = RNIL;  regFragPtr->rootPageRange = RNIL;  regFragPtr->currentPageRange = RNIL;  regFragPtr->noOfPages = 0;  regFragPtr->nextStartRange = 0;}//initFragRange()Uint32 Dbtup::allocFragPages(Fragrecord* const regFragPtr, Uint32 tafpNoAllocRequested) {  Uint32 tafpPagesAllocated = 0;  while (true) {    Uint32 noOfPagesAllocated = 0;    Uint32 noPagesToAllocate = tafpNoAllocRequested - tafpPagesAllocated;    Uint32 retPageRef = RNIL;    allocConsPages(noPagesToAllocate, noOfPagesAllocated, retPageRef);    if (noOfPagesAllocated == 0) {      ljam();      return tafpPagesAllocated;    }//if/* ---------------------------------------------------------------- *//*       IT IS NOW TIME TO PUT THE ALLOCATED AREA INTO THE PAGE     *//*       RANGE TABLE.                                               *//* ---------------------------------------------------------------- */    Uint32 startRange = regFragPtr->nextStartRange;    if (!insertPageRangeTab(regFragPtr, retPageRef, noOfPagesAllocated)) {      ljam();      returnCommonArea(retPageRef, noOfPagesAllocated);      return tafpPagesAllocated;    }//if    tafpPagesAllocated += noOfPagesAllocated;    Uint32 loopLimit = retPageRef + noOfPagesAllocated;    PagePtr loopPagePtr;/* ---------------------------------------------------------------- *//*       SINCE A NUMBER OF PAGES WERE ALLOCATED FROM COMMON AREA    *//*       WITH SUCCESS IT IS NOW TIME TO CHANGE THE STATE OF         *//*       THOSE PAGES TO EMPTY_MM AND LINK THEM INTO THE EMPTY       *//*       PAGE LIST OF THE FRAGMENT.                                 *//* ---------------------------------------------------------------- */    for (loopPagePtr.i = retPageRef; loopPagePtr.i < loopLimit; loopPagePtr.i++) {      ljam();      ptrCheckGuard(loopPagePtr, cnoOfPage, page);      loopPagePtr.p->pageWord[ZPAGE_STATE_POS] = ZEMPTY_MM;      loopPagePtr.p->pageWord[ZPAGE_FRAG_PAGE_ID_POS] = startRange +                                                        (loopPagePtr.i - retPageRef);      loopPagePtr.p->pageWord[ZPAGE_NEXT_POS] = loopPagePtr.p->pageWord[ZPAGE_FRAG_PAGE_ID_POS] + 1;    }//for    loopPagePtr.i = (retPageRef + noOfPagesAllocated) - 1;    ptrCheckGuard(loopPagePtr, cnoOfPage, page);    loopPagePtr.p->pageWord[ZPAGE_NEXT_POS] = regFragPtr->emptyPrimPage;    regFragPtr->emptyPrimPage = startRange;/* ---------------------------------------------------------------- *//*       WAS ENOUGH PAGES ALLOCATED OR ARE MORE NEEDED.             *//* ---------------------------------------------------------------- */    if (tafpPagesAllocated < tafpNoAllocRequested) {      ljam();    } else {      ndbrequire(tafpPagesAllocated == tafpNoAllocRequested);      ljam();      return tafpNoAllocRequested;    }//if  }//while}//Dbtup::allocFragPages()void Dbtup::allocMoreFragPages(Fragrecord* const regFragPtr) {  Uint32 noAllocPages = regFragPtr->noOfPages >> 3; // 12.5%  noAllocPages += regFragPtr->noOfPages >> 4; // 6.25%  noAllocPages += 2;/* -----------------------------------------------------------------*/// We will grow by 18.75% plus two more additional pages to grow// a little bit quicker in the beginning./* -----------------------------------------------------------------*/  allocFragPages(regFragPtr, noAllocPages);}//Dbtup::allocMoreFragPages()Uint32 Dbtup::leafPageRangeFull(Fragrecord*  const regFragPtr, PageRangePtr currPageRangePtr){/* ---------------------------------------------------------------- *//*       THE COMPLEX CASE WHEN THE LEAF NODE IS FULL. GO UP THE TREE*//*       TO FIND THE FIRST RECORD WITH A FREE ENTRY. ALLOCATE NEW   *//*       PAGE RANGE RECORDS THEN ALL THE WAY DOWN TO THE LEAF LEVEL *//*       AGAIN. THE TREE SHOULD ALWAYS REMAIN BALANCED.             *//* ---------------------------------------------------------------- */  PageRangePtr parentPageRangePtr;  PageRangePtr foundPageRangePtr;  parentPageRangePtr = currPageRangePtr;  Uint32 tiprNoLevels = 1;  while (true) {    ljam();    parentPageRangePtr.i = parentPageRangePtr.p->parentPtr;    if (parentPageRangePtr.i == RNIL) {      ljam();/* ---------------------------------------------------------------- *//*       WE HAVE REACHED THE ROOT. A NEW ROOT MUST BE ALLOCATED.    *//* ---------------------------------------------------------------- */      if (c_noOfFreePageRanges < tiprNoLevels) {        ljam();        return RNIL;      }//if      PageRangePtr oldRootPRPtr;      PageRangePtr newRootPRPtr;      oldRootPRPtr.i = regFragPtr->rootPageRange;      ptrCheckGuard(oldRootPRPtr, cnoOfPageRangeRec, pageRange);      seizePagerange(newRootPRPtr);      regFragPtr->rootPageRange = newRootPRPtr.i;      oldRootPRPtr.p->parentPtr = newRootPRPtr.i;      newRootPRPtr.p->basePageId[0] = oldRootPRPtr.i;      newRootPRPtr.p->parentPtr = RNIL;      newRootPRPtr.p->startRange[0] = 0;      newRootPRPtr.p->endRange[0] = regFragPtr->nextStartRange - 1;      newRootPRPtr.p->type[0] = ZNON_LEAF;      newRootPRPtr.p->startRange[1] = regFragPtr->nextStartRange;      newRootPRPtr.p->endRange[1] = regFragPtr->nextStartRange - 1;      newRootPRPtr.p->type[1] = ZNON_LEAF;      newRootPRPtr.p->currentIndexPos = 1;      foundPageRangePtr = newRootPRPtr;      break;    } else {      ljam();      ptrCheckGuard(parentPageRangePtr, cnoOfPageRangeRec, pageRange);      if (parentPageRangePtr.p->currentIndexPos < 3) {        ljam();/* ---------------------------------------------------------------- *//*       WE HAVE FOUND AN EMPTY ENTRY IN A PAGE RANGE RECORD.       *//*       ALLOCATE A NEW PAGE RANGE RECORD, FILL IN THE START RANGE, *//*       ALLOCATE A NEW PAGE RANGE RECORD AND UPDATE THE POINTERS   *//* ---------------------------------------------------------------- */        parentPageRangePtr.p->currentIndexPos++;        parentPageRangePtr.p->startRange[parentPageRangePtr.p->currentIndexPos] = regFragPtr->nextStartRange;        parentPageRangePtr.p->endRange[parentPageRangePtr.p->currentIndexPos] = regFragPtr->nextStartRange - 1;        parentPageRangePtr.p->type[parentPageRangePtr.p->currentIndexPos] = ZNON_LEAF;        foundPageRangePtr = parentPageRangePtr;        break;      } else {        ljam();        ndbrequire(parentPageRangePtr.p->currentIndexPos == 3);/* ---------------------------------------------------------------- *//*       THE PAGE RANGE RECORD WAS FULL. FIND THE PARENT RECORD     *//*       AND INCREASE THE NUMBER OF LEVELS WE HAVE TRAVERSED        *//*       GOING UP THE TREE.                                         *//* ---------------------------------------------------------------- */        tiprNoLevels++;      }//if    }//if  }//while/* ---------------------------------------------------------------- *//*       REMEMBER THE ERROR LEVEL IN CASE OF ALLOCATION ERRORS      *//* ---------------------------------------------------------------- */  PageRangePtr newPageRangePtr;  PageRangePtr prevPageRangePtr;  prevPageRangePtr = foundPageRangePtr;  if (c_noOfFreePageRanges < tiprNoLevels) {    ljam();    return RNIL;  }//if/* ---------------------------------------------------------------- *//*       NOW WE HAVE PERFORMED THE SEARCH UPWARDS AND FILLED IN THE *//*       PROPER FIELDS IN THE PAGE RANGE RECORD WHERE SOME SPACE    *//*       WAS FOUND. THE NEXT STEP IS TO ALLOCATE PAGE RANGES SO     *//*       THAT WE KEEP THE B-TREE BALANCED. THE NEW PAGE RANGE       *//*       ARE ALSO PROPERLY UPDATED ON THE PATH TO THE LEAF LEVEL.   *//* ---------------------------------------------------------------- */  while (true) {    ljam();    seizePagerange(newPageRangePtr);    tiprNoLevels--;    ndbrequire(prevPageRangePtr.p->currentIndexPos < 4);    prevPageRangePtr.p->basePageId[prevPageRangePtr.p->currentIndexPos] = newPageRangePtr.i;    newPageRangePtr.p->parentPtr = prevPageRangePtr.i;    newPageRangePtr.p->currentIndexPos = 0;    if (tiprNoLevels > 0) {      ljam();      newPageRangePtr.p->startRange[0] = regFragPtr->nextStartRange;      newPageRangePtr.p->endRange[0] = regFragPtr->nextStartRange - 1;      newPageRangePtr.p->type[0] = ZNON_LEAF;      prevPageRangePtr = newPageRangePtr;    } else {      ljam();      break;    }//if  }//while  return newPageRangePtr.i;}//Dbtup::leafPageRangeFull()void Dbtup::releasePagerange(PageRangePtr regPRPtr) {  regPRPtr.p->nextFree = cfirstfreerange;  cfirstfreerange = regPRPtr.i;  c_noOfFreePageRanges++;}//Dbtup::releasePagerange()void Dbtup::seizePagerange(PageRangePtr& regPageRangePtr) {  regPageRangePtr.i = cfirstfreerange;  ptrCheckGuard(regPageRangePtr, cnoOfPageRangeRec, pageRange);  cfirstfreerange = regPageRangePtr.p->nextFree;  regPageRangePtr.p->nextFree = RNIL;  regPageRangePtr.p->currentIndexPos = 0;  regPageRangePtr.p->parentPtr = RNIL;  for (Uint32 i = 0; i < 4; i++) {    regPageRangePtr.p->startRange[i] = 1;    regPageRangePtr.p->endRange[i] = 0;    regPageRangePtr.p->type[i] = ZNON_LEAF;    regPageRangePtr.p->basePageId[i] = (Uint32)-1;  }//for  c_noOfFreePageRanges--;}//Dbtup::seizePagerange()void Dbtup::errorHandler(Uint32 errorCode){  switch (errorCode) {  case 0:    ljam();    break;  case 1:    ljam();    break;  case 2:    ljam();    break;  default:    ljam();  }  ndbrequire(false);}//Dbtup::errorHandler()

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -