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

📄 dbtuxmeta.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        jam();        errorCode = TuxAddAttrRef::InvalidNodeSize;        break;      }      tree.m_minOccup = tree.m_maxOccup - maxSlack;      // root node does not exist (also set by ctor)      tree.m_root = NullTupLoc;#ifdef VM_TRACE      if (debugFlags & DebugMeta) {        if (fragOpPtr.p->m_fragNo == 0) {          debugOut << "Index id=" << indexPtr.i;          debugOut << " nodeSize=" << tree.m_nodeSize;          debugOut << " headSize=" << NodeHeadSize;          debugOut << " prefSize=" << tree.m_prefSize;          debugOut << " entrySize=" << TreeEntSize;          debugOut << " minOccup=" << tree.m_minOccup;          debugOut << " maxOccup=" << tree.m_maxOccup;          debugOut << endl;        }      }#endif      // fragment is defined#ifdef VM_TRACE      if (debugFlags & DebugMeta) {        debugOut << "Release frag op " << fragOpPtr.i << " " << *fragOpPtr.p << endl;      }#endif      c_fragOpPool.release(fragOpPtr);    }    // success    TuxAddAttrConf* conf = (TuxAddAttrConf*)signal->getDataPtrSend();    conf->userPtr = fragOpPtr.p->m_userPtr;    conf->lastAttr = lastAttr;    sendSignal(fragOpPtr.p->m_userRef, GSN_TUX_ADD_ATTRCONF,        signal, TuxAddAttrConf::SignalLength, JBB);    return;  } while (0);  // error  TuxAddAttrRef* ref = (TuxAddAttrRef*)signal->getDataPtrSend();  ref->userPtr = fragOpPtr.p->m_userPtr;  ref->errorCode = errorCode;  sendSignal(fragOpPtr.p->m_userRef, GSN_TUX_ADD_ATTRREF,      signal, TuxAddAttrRef::SignalLength, JBB);#ifdef VM_TRACE    if (debugFlags & DebugMeta) {      debugOut << "Release on attr error frag op " << fragOpPtr.i << " " << *fragOpPtr.p << endl;    }#endif  c_fragOpPool.release(fragOpPtr);  // let DICT drop the unfinished index}/* * LQH aborts on-going create index operation. */voidDbtux::abortAddFragOp(Signal* signal){  FragOpPtr fragOpPtr;  IndexPtr indexPtr;  c_fragOpPool.getPtr(fragOpPtr, signal->theData[1]);  c_indexPool.getPtr(indexPtr, fragOpPtr.p->m_indexId);#ifdef VM_TRACE  if (debugFlags & DebugMeta) {    debugOut << "Release on abort frag op " << fragOpPtr.i << " " << *fragOpPtr.p << endl;  }#endif  c_fragOpPool.release(fragOpPtr);  // let DICT drop the unfinished index}/* * Set index online.  Currently at system restart this arrives before * build and is therefore not correct. */voidDbtux::execALTER_INDX_REQ(Signal* signal){  jamEntry();  const AlterIndxReq reqCopy = *(const AlterIndxReq*)signal->getDataPtr();  const AlterIndxReq* const req = &reqCopy;  // set index online after build  IndexPtr indexPtr;  c_indexPool.getPtr(indexPtr, req->getIndexId());  indexPtr.p->m_state = Index::Online;#ifdef VM_TRACE  if (debugFlags & DebugMeta) {    debugOut << "Online index " << indexPtr.i << " " << *indexPtr.p << endl;  }#endif  // success  AlterIndxConf* const conf = (AlterIndxConf*)signal->getDataPtrSend();  conf->setUserRef(reference());  conf->setConnectionPtr(req->getConnectionPtr());  conf->setRequestType(req->getRequestType());  conf->setTableId(req->getTableId());  conf->setIndexId(req->getIndexId());  conf->setIndexVersion(req->getIndexVersion());  sendSignal(req->getUserRef(), GSN_ALTER_INDX_CONF,      signal, AlterIndxConf::SignalLength, JBB);}/* * Drop index. * * Uses same DROP_TAB_REQ signal as normal tables. */voidDbtux::execDROP_TAB_REQ(Signal* signal){  jamEntry();  const DropTabReq reqCopy = *(const DropTabReq*)signal->getDataPtr();  const DropTabReq* const req = &reqCopy;  IndexPtr indexPtr;  Uint32 tableId = req->tableId;  Uint32 senderRef = req->senderRef;  Uint32 senderData = req->senderData;  if (tableId >= c_indexPool.getSize()) {    jam();    // reply to sender    DropTabConf* const conf = (DropTabConf*)signal->getDataPtrSend();    conf->senderRef = reference();    conf->senderData = senderData;    conf->tableId = tableId;    sendSignal(senderRef, GSN_DROP_TAB_CONF,	       signal, DropTabConf::SignalLength, JBB);    return;  }    c_indexPool.getPtr(indexPtr, req->tableId);  // drop works regardless of index state#ifdef VM_TRACE  if (debugFlags & DebugMeta) {    debugOut << "Drop index " << indexPtr.i << " " << *indexPtr.p << endl;  }#endif  ndbrequire(req->senderRef != 0);  dropIndex(signal, indexPtr, req->senderRef, req->senderData);}voidDbtux::dropIndex(Signal* signal, IndexPtr indexPtr, Uint32 senderRef, Uint32 senderData){  jam();  indexPtr.p->m_state = Index::Dropping;  // drop fragments  while (indexPtr.p->m_numFrags > 0) {    jam();    Uint32 i = --indexPtr.p->m_numFrags;    FragPtr fragPtr;    c_fragPool.getPtr(fragPtr, indexPtr.p->m_fragPtrI[i]);    c_fragPool.release(fragPtr);  }  // drop attributes  if (indexPtr.p->m_descPage != RNIL) {    jam();    freeDescEnt(indexPtr);    indexPtr.p->m_descPage = RNIL;  }  if (senderRef != 0) {    jam();    // reply to sender    DropTabConf* const conf = (DropTabConf*)signal->getDataPtrSend();    conf->senderRef = reference();    conf->senderData = senderData;    conf->tableId = indexPtr.i;    sendSignal(senderRef, GSN_DROP_TAB_CONF,        signal, DropTabConf::SignalLength, JBB);  }  new (indexPtr.p) Index();}/* * Subroutines. */boolDbtux::allocDescEnt(IndexPtr indexPtr){  jam();  const unsigned size = DescHeadSize + indexPtr.p->m_numAttrs * DescAttrSize;  DescPagePtr pagePtr;  pagePtr.i = c_descPageList;  while (pagePtr.i != RNIL) {    jam();    c_descPagePool.getPtr(pagePtr);    if (pagePtr.p->m_numFree >= size) {      jam();      break;    }    pagePtr.i = pagePtr.p->m_nextPage;  }  if (pagePtr.i == RNIL) {    jam();    if (! c_descPagePool.seize(pagePtr)) {      jam();      return false;    }    new (pagePtr.p) DescPage();    // add in front of list    pagePtr.p->m_nextPage = c_descPageList;    c_descPageList = pagePtr.i;    pagePtr.p->m_numFree = DescPageSize;  }  ndbrequire(pagePtr.p->m_numFree >= size);  indexPtr.p->m_descPage = pagePtr.i;  indexPtr.p->m_descOff = DescPageSize - pagePtr.p->m_numFree;  pagePtr.p->m_numFree -= size;  DescEnt& descEnt = getDescEnt(indexPtr.p->m_descPage, indexPtr.p->m_descOff);  descEnt.m_descHead.m_indexId = indexPtr.i;  descEnt.m_descHead.pad1 = 0;  return true;}voidDbtux::freeDescEnt(IndexPtr indexPtr){  DescPagePtr pagePtr;  c_descPagePool.getPtr(pagePtr, indexPtr.p->m_descPage);  Uint32* const data = pagePtr.p->m_data;  const unsigned size = DescHeadSize + indexPtr.p->m_numAttrs * DescAttrSize;  unsigned off = indexPtr.p->m_descOff;  // move the gap to the free area at the top  while (off + size < DescPageSize - pagePtr.p->m_numFree) {    jam();    // next entry to move over the gap    DescEnt& descEnt2 = *(DescEnt*)&data[off + size];    Uint32 indexId2 = descEnt2.m_descHead.m_indexId;    Index& index2 = *c_indexPool.getPtr(indexId2);    unsigned size2 = DescHeadSize + index2.m_numAttrs * DescAttrSize;    ndbrequire(        index2.m_descPage == pagePtr.i &&        index2.m_descOff == off + size);    // move the entry (overlapping copy if size < size2)    unsigned i;    for (i = 0; i < size2; i++) {      jam();      data[off + i] = data[off + size + i];    }    off += size2;    // adjust page offset in index and all fragments    index2.m_descOff -= size;    for (i = 0; i < index2.m_numFrags; i++) {      jam();      Frag& frag2 = *c_fragPool.getPtr(index2.m_fragPtrI[i]);      frag2.m_descOff -= size;      ndbrequire(          frag2.m_descPage == index2.m_descPage &&          frag2.m_descOff == index2.m_descOff);    }  }  ndbrequire(off + size == DescPageSize - pagePtr.p->m_numFree);  pagePtr.p->m_numFree += size;}

⌨️ 快捷键说明

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