📄 dbtuproutines.cpp
字号:
boolDbtup::readFixedSizeTHOneWordNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ if (!nullFlagCheck(attrDes2)) { ljam(); return readFixedSizeTHOneWordNotNULL(outBuffer, ahOut, attrDescriptor, attrDes2); } else { ljam(); ahOut->setNULL(); return true; }//if}//Dbtup::readFixedSizeTHOneWordNULLable()boolDbtup::readFixedSizeTHTwoWordNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ if (!nullFlagCheck(attrDes2)) { ljam(); return readFixedSizeTHTwoWordNotNULL(outBuffer, ahOut, attrDescriptor, attrDes2); } else { ljam(); ahOut->setNULL(); return true; }//if}//Dbtup::readFixedSizeTHTwoWordNULLable()boolDbtup::readFixedSizeTHManyWordNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ if (!nullFlagCheck(attrDes2)) { ljam(); return readFixedSizeTHManyWordNotNULL(outBuffer, ahOut, attrDescriptor, attrDes2); } else { ljam(); ahOut->setNULL(); return true; }//if}//Dbtup::readFixedSizeTHManyWordNULLable()boolDbtup::readFixedSizeTHZeroWordNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); if (nullFlagCheck(attrDes2)) { ljam(); ahOut->setNULL(); }//if return true;}//Dbtup::readFixedSizeTHZeroWordNULLable()boolDbtup::nullFlagCheck(Uint32 attrDes2){ Tablerec* const regTabPtr = tabptr.p; Uint32 nullFlagOffsetInTuple = AttributeOffset::getNullFlagOffset(attrDes2); ndbrequire(nullFlagOffsetInTuple < regTabPtr->tupNullWords); nullFlagOffsetInTuple += regTabPtr->tupNullIndex; ndbrequire(nullFlagOffsetInTuple < tCheckOffset); return (AttributeOffset::isNULL(tTupleHeader[nullFlagOffsetInTuple], attrDes2));}//Dbtup::nullFlagCheck()boolDbtup::readVariableSizedAttr(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readVariableSizedAttr()boolDbtup::readVarSizeUnlimitedNotNULL(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readVarSizeUnlimitedNotNULL()boolDbtup::readVarSizeUnlimitedNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readVarSizeUnlimitedNULLable()boolDbtup::readBigVarSizeNotNULL(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readBigVarSizeNotNULL()boolDbtup::readBigVarSizeNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readBigVarSizeNULLable()boolDbtup::readSmallVarSizeNotNULL(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readSmallVarSizeNotNULL()boolDbtup::readSmallVarSizeNULLable(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readSmallVarSizeNULLable()boolDbtup::readDynFixedSize(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readDynFixedSize()boolDbtup::readDynVarSizeUnlimited(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readDynVarSizeUnlimited()boolDbtup::readDynBigVarSize(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readDynBigVarSize()boolDbtup::readDynSmallVarSize(Uint32* outBuffer, AttributeHeader* ahOut, Uint32 attrDescriptor, Uint32 attrDes2){ ljam(); terrorCode = ZVAR_SIZED_NOT_SUPPORTED; return false;}//Dbtup::readDynSmallVarSize()/* ---------------------------------------------------------------------- *//* THIS ROUTINE IS USED TO UPDATE A NUMBER OF ATTRIBUTES. IT IS *//* USED BY THE INSERT ROUTINE, THE UPDATE ROUTINE AND IT CAN BE *//* CALLED SEVERAL TIMES FROM THE INTERPRETER. */// In addition to the parameters used in the call it also relies on the// following variables set-up properly.//// pagep.p Page record pointer// fragptr.p Fragment record pointer// operPtr.p Operation record pointer// tabptr.p Table record pointer/* ---------------------------------------------------------------------- */int Dbtup::updateAttributes(Page* const pagePtr, Uint32 tupHeadOffset, Uint32* inBuffer, Uint32 inBufLen){ Tablerec* const regTabPtr = tabptr.p; Operationrec* const regOperPtr = operPtr.p; Uint32 numAttributes = regTabPtr->noOfAttr; Uint32 attrDescriptorStart = regTabPtr->tabDescriptor; ndbrequire(attrDescriptorStart + (numAttributes << ZAD_LOG_SIZE) <= cnoOfTabDescrRec); tCheckOffset = regTabPtr->tupheadsize; tTupleHeader = &pagePtr->pageWord[tupHeadOffset]; Uint32 inBufIndex = 0; tInBufIndex = 0; tInBufLen = inBufLen; ndbrequire(tupHeadOffset + tCheckOffset <= ZWORDS_ON_PAGE); while (inBufIndex < inBufLen) { AttributeHeader ahIn(inBuffer[inBufIndex]); Uint32 attributeId = ahIn.getAttributeId(); Uint32 attrDescriptorIndex = attrDescriptorStart + (attributeId << ZAD_LOG_SIZE); if (attributeId < numAttributes) { Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr; Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr; if ((AttributeDescriptor::getPrimaryKey(attrDescriptor)) && (regOperPtr->optype != ZINSERT)) { if (checkUpdateOfPrimaryKey(&inBuffer[inBufIndex], regTabPtr)) { ljam(); terrorCode = ZTRY_UPDATE_PRIMARY_KEY; return -1; }//if }//if UpdateFunction f = regTabPtr->updateFunctionArray[attributeId]; ljam(); regOperPtr->changeMask.set(attributeId); if ((this->*f)(inBuffer, attrDescriptor, attributeOffset)) { inBufIndex = tInBufIndex; continue; } else { ljam(); return -1; }//if } else { ljam(); terrorCode = ZATTRIBUTE_ID_ERROR; return -1; }//if }//while return 0;}//Dbtup::updateAttributes()boolDbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr){ Uint32 keyReadBuffer[MAX_KEY_SIZE_IN_WORDS]; Uint32 attributeHeader; AttributeHeader* ahOut = (AttributeHeader*)&attributeHeader; AttributeHeader ahIn(*updateBuffer); Uint32 attributeId = ahIn.getAttributeId(); Uint32 attrDescriptorIndex = regTabPtr->tabDescriptor + (attributeId << ZAD_LOG_SIZE); Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr; Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr; Uint32 xfrmBuffer[1 + MAX_KEY_SIZE_IN_WORDS * MAX_XFRM_MULTIPLY]; Uint32 charsetFlag = AttributeOffset::getCharsetFlag(attributeOffset); if (charsetFlag) { Uint32 csIndex = AttributeOffset::getCharsetPos(attributeOffset); CHARSET_INFO* cs = regTabPtr->charsetArray[csIndex]; Uint32 srcPos = 0; Uint32 dstPos = 0; xfrm_attr(attrDescriptor, cs, &updateBuffer[1], srcPos, &xfrmBuffer[1], dstPos, MAX_KEY_SIZE_IN_WORDS * MAX_XFRM_MULTIPLY); ahIn.setDataSize(dstPos); xfrmBuffer[0] = ahIn.m_value; updateBuffer = xfrmBuffer; } ReadFunction f = regTabPtr->readFunctionArray[attributeId]; AttributeHeader::init(&attributeHeader, attributeId, 0); tOutBufIndex = 0; tMaxRead = MAX_KEY_SIZE_IN_WORDS; bool tmp = tXfrmFlag; tXfrmFlag = true; ndbrequire((this->*f)(&keyReadBuffer[0], ahOut, attrDescriptor, attributeOffset)); tXfrmFlag = tmp; ndbrequire(tOutBufIndex == ahOut->getDataSize()); if (ahIn.getDataSize() != ahOut->getDataSize()) { ljam(); return true; }//if if (memcmp(&keyReadBuffer[0], &updateBuffer[1], tOutBufIndex << 2) != 0) { ljam(); return true; }//if return false;}//Dbtup::checkUpdateOfPrimaryKey()#if 0void Dbtup::checkPages(Fragrecord* const regFragPtr){ Uint32 noPages = getNoOfPages(regFragPtr); for (Uint32 i = 0; i < noPages ; i++) { PagePtr pagePtr; pagePtr.i = getRealpid(regFragPtr, i); ptrCheckGuard(pagePtr, cnoOfPage, page); ndbrequire(pagePtr.p->pageWord[1] != (RNIL - 1)); }}#endifboolDbtup::updateFixedSizeTHOneWordNotNULL(Uint32* inBuffer, Uint32 attrDescriptor, Uint32 attrDes2){ Uint32 indexBuf = tInBufIndex; Uint32 inBufLen = tInBufLen; Uint32 updateOffset = AttributeOffset::getOffset(attrDes2); AttributeHeader ahIn(inBuffer[indexBuf]); Uint32 nullIndicator = ahIn.isNULL(); Uint32 newIndex = indexBuf + 2; ndbrequire(updateOffset < tCheckOffset); if (newIndex <= inBufLen) { Uint32 updateWord = inBuffer[indexBuf + 1]; if (!nullIndicator) { ljam(); tInBufIndex = newIndex; tTupleHeader[updateOffset] = updateWord; return true; } else { ljam(); terrorCode = ZNOT_NULL_ATTR; return false; }//if } else { ljam(); terrorCode = ZAI_INCONSISTENCY_ERROR; return false; }//if return true;}//Dbtup::updateFixedSizeTHOneWordNotNULL()boolDbtup::updateFixedSizeTHTwoWordNotNULL(Uint32* inBuffer, Uint32 attrDescriptor, Uint32 attrDes2){ Uint32 indexBuf = tInBufIndex; Uint32 inBufLen = tInBufLen; Uint32 updateOffset = AttributeOffset::getOffset(attrDes2); AttributeHeader ahIn(inBuffer[indexBuf]); Uint32 nullIndicator = ahIn.isNULL(); Uint32 newIndex = indexBuf + 3; ndbrequire((updateOffset + 1) < tCheckOffset); if (newIndex <= inBufLen) { Uint32 updateWord1 = inBuffer[indexBuf + 1]; Uint32 updateWord2 = inBuffer[indexBuf + 2]; if (!nullIndicator) { ljam(); tInBufIndex = newIndex; tTupleHeader[updateOffset] = updateWord1; tTupleHeader[updateOffset + 1] = updateWord2; return true; } else { ljam(); terrorCode = ZNOT_NULL_ATTR; return false; }//if } else { ljam(); terrorCode = ZAI_INCONSISTENCY_ERROR; return false; }//if}//Dbtup::updateFixedSizeTHTwoWordNotNULL()boolDbtup::updateFixedSizeTHManyWordNotNULL(Uint32* inBuffer, Uint32 attrDescriptor, Uint32 attrDes2){ Uint32 indexBuf = tInBufIndex; Uint32 inBufLen = tInBufLen;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -