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

📄 dbdict.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */#include <ndb_global.h>#include <my_sys.h>#define DBDICT_C#include "Dbdict.hpp"#include <ndb_limits.h>#include <NdbOut.hpp>#include <Properties.hpp>#include <Configuration.hpp>#include <SectionReader.hpp>#include <SimpleProperties.hpp>#include <AttributeHeader.hpp>#include <KeyDescriptor.hpp>#include <signaldata/DictSchemaInfo.hpp>#include <signaldata/DictTabInfo.hpp>#include <signaldata/DropTabFile.hpp>#include <signaldata/EventReport.hpp>#include <signaldata/FsCloseReq.hpp>#include <signaldata/FsConf.hpp>#include <signaldata/FsOpenReq.hpp>#include <signaldata/FsReadWriteReq.hpp>#include <signaldata/FsRef.hpp>#include <signaldata/GetTabInfo.hpp>#include <signaldata/GetTableId.hpp>#include <signaldata/HotSpareRep.hpp>#include <signaldata/NFCompleteRep.hpp>#include <signaldata/NodeFailRep.hpp>#include <signaldata/ReadNodesConf.hpp>#include <signaldata/RelTabMem.hpp>#include <signaldata/WaitGCP.hpp>#include <signaldata/ListTables.hpp>#include <signaldata/CreateTrig.hpp>#include <signaldata/AlterTrig.hpp>#include <signaldata/DropTrig.hpp>#include <signaldata/CreateIndx.hpp>#include <signaldata/DropIndx.hpp>#include <signaldata/BuildIndx.hpp>#include <signaldata/CreateEvnt.hpp>#include <signaldata/UtilPrepare.hpp>#include <signaldata/UtilExecute.hpp>#include <signaldata/UtilRelease.hpp>#include <signaldata/SumaImpl.hpp> #include <GrepError.hpp>//#include <signaldata/DropEvnt.hpp>#include <signaldata/LqhFrag.hpp>#include <signaldata/DiAddTab.hpp>#include <signaldata/DihStartTab.hpp>#include <signaldata/DropTable.hpp>#include <signaldata/DropTab.hpp>#include <signaldata/PrepDropTab.hpp>#include <signaldata/CreateTable.hpp>#include <signaldata/AlterTable.hpp>#include <signaldata/AlterTab.hpp>#include <signaldata/CreateFragmentation.hpp>#include <signaldata/CreateTab.hpp>#include <NdbSleep.h>#include <signaldata/ApiBroadcast.hpp>#define ZNOT_FOUND 626#define ZALREADYEXIST 630//#define EVENT_PH2_DEBUG//#define EVENT_PH3_DEBUG//#define EVENT_DEBUG#define EVENT_TRACE \//  ndbout_c("Event debug trace: File: %s Line: %u", __FILE__, __LINE__)#define DIV(x,y) (((x)+(y)-1)/(y))#include <ndb_version.h>staticUint32alter_table_inc_schema_version(Uint32 old){   return (old & 0x00FFFFFF) + ((old + 0x1000000) & 0xFF000000);}staticUint32alter_table_dec_schema_version(Uint32 old){  return (old & 0x00FFFFFF) + ((old - 0x1000000) & 0xFF000000);}staticUint32create_table_inc_schema_version(Uint32 old){  return (old + 0x00000001) & 0x00FFFFFF;}/* **************************************************************** *//* ---------------------------------------------------------------- *//* MODULE:          GENERAL MODULE -------------------------------- *//* ---------------------------------------------------------------- *//*                                                                  *//* This module contains general stuff. Mostly debug signals and     *//* general signals that go into a specific module after checking a  *//* state variable. Also general subroutines used by many.           *//* ---------------------------------------------------------------- *//* **************************************************************** *//* ---------------------------------------------------------------- */// This signal is used to dump states of various variables in the// block by command./* ---------------------------------------------------------------- */voidDbdict::execDUMP_STATE_ORD(Signal* signal){  jamEntry();#ifdef VM_TRACE  if(signal->theData[0] == 1222){    const Uint32 tab = signal->theData[1];    PrepDropTabReq* req = (PrepDropTabReq*)signal->getDataPtr();    req->senderRef = reference();    req->senderData = 1222;    req->tableId = tab;    sendSignal(DBLQH_REF, GSN_PREP_DROP_TAB_REQ, signal,	       PrepDropTabReq::SignalLength, JBB);  }  if(signal->theData[0] == 1223){    const Uint32 tab = signal->theData[1];    PrepDropTabReq* req = (PrepDropTabReq*)signal->getDataPtr();    req->senderRef = reference();    req->senderData = 1222;    req->tableId = tab;    sendSignal(DBTC_REF, GSN_PREP_DROP_TAB_REQ, signal,	       PrepDropTabReq::SignalLength, JBB);  }  if(signal->theData[0] == 1224){    const Uint32 tab = signal->theData[1];    PrepDropTabReq* req = (PrepDropTabReq*)signal->getDataPtr();    req->senderRef = reference();    req->senderData = 1222;    req->tableId = tab;    sendSignal(DBDIH_REF, GSN_PREP_DROP_TAB_REQ, signal,	       PrepDropTabReq::SignalLength, JBB);  }  if(signal->theData[0] == 1225){    const Uint32 tab = signal->theData[1];    const Uint32 ver = signal->theData[2];    TableRecordPtr tabRecPtr;    c_tableRecordPool.getPtr(tabRecPtr, tab);    DropTableReq * req = (DropTableReq*)signal->getDataPtr();    req->senderData = 1225;    req->senderRef = numberToRef(1,1);    req->tableId = tab;    req->tableVersion = tabRecPtr.p->tableVersion + ver;    sendSignal(DBDICT_REF, GSN_DROP_TABLE_REQ, signal,	       DropTableReq::SignalLength, JBB);  }#endif      return;}//Dbdict::execDUMP_STATE_ORD()/* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */// CONTINUEB is used when a real-time break is needed for long// processes./* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */void Dbdict::execCONTINUEB(Signal* signal) {  jamEntry();  switch (signal->theData[0]) {  case ZPACK_TABLE_INTO_PAGES :    jam();    packTableIntoPages(signal, signal->theData[1], signal->theData[2]);    break;  case ZSEND_GET_TAB_RESPONSE :    jam();    sendGetTabResponse(signal);    break;  default :    ndbrequire(false);    break;  }//switch  return;}//execCONTINUEB()/* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */// Routine to handle pack table into pages./* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */void Dbdict::packTableIntoPages(Signal* signal, Uint32 tableId, Uint32 pageId){  PageRecordPtr pagePtr;  TableRecordPtr tablePtr;  c_pageRecordArray.getPtr(pagePtr, pageId);    memset(&pagePtr.p->word[0], 0, 4 * ZPAGE_HEADER_SIZE);  c_tableRecordPool.getPtr(tablePtr, tableId);  LinearWriter w(&pagePtr.p->word[ZPAGE_HEADER_SIZE], 		 8 * ZSIZE_OF_PAGES_IN_WORDS);  w.first();  packTableIntoPagesImpl(w, tablePtr, signal);      Uint32 wordsOfTable = w.getWordsUsed();  Uint32 pagesUsed =     DIV(wordsOfTable + ZPAGE_HEADER_SIZE, ZSIZE_OF_PAGES_IN_WORDS);  pagePtr.p->word[ZPOS_CHECKSUM] =     computeChecksum(&pagePtr.p->word[0], pagesUsed * ZSIZE_OF_PAGES_IN_WORDS);    switch (c_packTable.m_state) {  case PackTable::PTS_IDLE:  case PackTable::PTS_ADD_TABLE_MASTER:  case PackTable::PTS_ADD_TABLE_SLAVE:  case PackTable::PTS_RESTART:    ndbrequire(false);    break;  case PackTable::PTS_GET_TAB:    jam();    c_retrieveRecord.retrievedNoOfPages = pagesUsed;    c_retrieveRecord.retrievedNoOfWords = wordsOfTable;    sendGetTabResponse(signal);    return;    break;  }//switch  ndbrequire(false);  return;}//packTableIntoPages()voidDbdict::packTableIntoPagesImpl(SimpleProperties::Writer & w,			       TableRecordPtr tablePtr,			       Signal* signal){    w.add(DictTabInfo::TableName, tablePtr.p->tableName);  w.add(DictTabInfo::TableId, tablePtr.i);#ifdef HAVE_TABLE_REORG  w.add(DictTabInfo::SecondTableId, tablePtr.p->secondTable);#else  w.add(DictTabInfo::SecondTableId, (Uint32)0);#endif  w.add(DictTabInfo::TableVersion, tablePtr.p->tableVersion);  w.add(DictTabInfo::NoOfKeyAttr, tablePtr.p->noOfPrimkey);  w.add(DictTabInfo::NoOfAttributes, tablePtr.p->noOfAttributes);  w.add(DictTabInfo::NoOfNullable, tablePtr.p->noOfNullAttr);  w.add(DictTabInfo::NoOfVariable, (Uint32)0);  w.add(DictTabInfo::KeyLength, tablePtr.p->tupKeyLength);    w.add(DictTabInfo::TableLoggedFlag, tablePtr.p->storedTable);  w.add(DictTabInfo::MinLoadFactor, tablePtr.p->minLoadFactor);  w.add(DictTabInfo::MaxLoadFactor, tablePtr.p->maxLoadFactor);  w.add(DictTabInfo::TableKValue, tablePtr.p->kValue);  w.add(DictTabInfo::FragmentTypeVal, tablePtr.p->fragmentType);  w.add(DictTabInfo::TableTypeVal, tablePtr.p->tableType);    if(!signal)  {    w.add(DictTabInfo::FragmentCount, tablePtr.p->fragmentCount);  }  else  {    Uint32 * theData = signal->getDataPtrSend();    CreateFragmentationReq * const req = (CreateFragmentationReq*)theData;    req->senderRef = 0;    req->senderData = RNIL;    req->fragmentationType = tablePtr.p->fragmentType;    req->noOfFragments = 0;    req->fragmentNode = 0;    req->primaryTableId = tablePtr.i;    EXECUTE_DIRECT(DBDIH, GSN_CREATE_FRAGMENTATION_REQ, signal,		   CreateFragmentationReq::SignalLength);    if(signal->theData[0] == 0)    {      Uint16 *data = (Uint16*)&signal->theData[25];      Uint32 count = 2 + data[0] * data[1];      w.add(DictTabInfo::FragmentDataLen, 2*count);      w.add(DictTabInfo::FragmentData, data, 2*count);    }  }    if (tablePtr.p->primaryTableId != RNIL){    TableRecordPtr primTab;    c_tableRecordPool.getPtr(primTab, tablePtr.p->primaryTableId);    w.add(DictTabInfo::PrimaryTable, primTab.p->tableName);    w.add(DictTabInfo::PrimaryTableId, tablePtr.p->primaryTableId);    w.add(DictTabInfo::IndexState, tablePtr.p->indexState);    w.add(DictTabInfo::InsertTriggerId, tablePtr.p->insertTriggerId);    w.add(DictTabInfo::UpdateTriggerId, tablePtr.p->updateTriggerId);    w.add(DictTabInfo::DeleteTriggerId, tablePtr.p->deleteTriggerId);    w.add(DictTabInfo::CustomTriggerId, tablePtr.p->customTriggerId);  }  w.add(DictTabInfo::FrmLen, tablePtr.p->frmLen);  w.add(DictTabInfo::FrmData, tablePtr.p->frmData, tablePtr.p->frmLen);    Uint32 nextAttribute = tablePtr.p->firstAttribute;  AttributeRecordPtr attrPtr;  do {    jam();    c_attributeRecordPool.getPtr(attrPtr, nextAttribute);        w.add(DictTabInfo::AttributeName, attrPtr.p->attributeName);    w.add(DictTabInfo::AttributeId, attrPtr.p->attributeId);    w.add(DictTabInfo::AttributeKeyFlag, attrPtr.p->tupleKey > 0);        const Uint32 desc = attrPtr.p->attributeDescriptor;    const Uint32 attrType = AttributeDescriptor::getType(desc);    const Uint32 attrSize = AttributeDescriptor::getSize(desc);    const Uint32 arraySize = AttributeDescriptor::getArraySize(desc);    const Uint32 nullable = AttributeDescriptor::getNullable(desc);    const Uint32 DKey = AttributeDescriptor::getDKey(desc);    // AttributeType deprecated    w.add(DictTabInfo::AttributeSize, attrSize);    w.add(DictTabInfo::AttributeArraySize, arraySize);    w.add(DictTabInfo::AttributeNullableFlag, nullable);    w.add(DictTabInfo::AttributeDKey, DKey);    w.add(DictTabInfo::AttributeExtType, attrType);    w.add(DictTabInfo::AttributeExtPrecision, attrPtr.p->extPrecision);    w.add(DictTabInfo::AttributeExtScale, attrPtr.p->extScale);    w.add(DictTabInfo::AttributeExtLength, attrPtr.p->extLength);    w.add(DictTabInfo::AttributeAutoIncrement, 	  (Uint32)attrPtr.p->autoIncrement);    w.add(DictTabInfo::AttributeDefaultValue, attrPtr.p->defaultValue);        w.add(DictTabInfo::AttributeEnd, 1);    nextAttribute = attrPtr.p->nextAttrInTable;  } while (nextAttribute != RNIL);    w.add(DictTabInfo::TableEnd, 1);}/* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */// The routines to handle responses from file system./* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- *//* ---------------------------------------------------------------- */// A file was successfully closed./* ---------------------------------------------------------------- */void Dbdict::execFSCLOSECONF(Signal* signal) {  FsConnectRecordPtr fsPtr;  FsConf * const fsConf = (FsConf *)&signal->theData[0];  jamEntry();  c_fsConnectRecordPool.getPtr(fsPtr, fsConf->userPointer);  switch (fsPtr.p->fsState) {  case FsConnectRecord::CLOSE_WRITE_SCHEMA:    jam();

⌨️ 快捷键说明

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