📄 dbdict.cpp
字号:
/* 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 + -