DbtupRoutines.cpp
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:35k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #define DBTUP_C
  14. #include "Dbtup.hpp"
  15. #include <RefConvert.hpp>
  16. #include <ndb_limits.h>
  17. #include <pc.hpp>
  18. #include <AttributeDescriptor.hpp>
  19. #include "AttributeOffset.hpp"
  20. #include <AttributeHeader.hpp>
  21. #define ljam() { jamLine(3000 + __LINE__); }
  22. #define ljamEntry() { jamEntryLine(3000 + __LINE__); }
  23. void
  24. Dbtup::setUpQueryRoutines(Tablerec* const regTabPtr)
  25. {
  26.   Uint32 startDescriptor = regTabPtr->tabDescriptor;
  27.   ndbrequire((startDescriptor + (regTabPtr->noOfAttr << ZAD_LOG_SIZE)) <= cnoOfTabDescrRec);
  28.   for (Uint32 i = 0; i < regTabPtr->noOfAttr; i++) {
  29.     Uint32 attrDescriptorStart = startDescriptor + (i << ZAD_LOG_SIZE);
  30.     Uint32 attrDescriptor = tableDescriptor[attrDescriptorStart].tabDescr;
  31.     Uint32 attrOffset = tableDescriptor[attrDescriptorStart + 1].tabDescr;
  32.     if (!AttributeDescriptor::getDynamic(attrDescriptor)) {
  33.       if ((AttributeDescriptor::getArrayType(attrDescriptor) == ZNON_ARRAY) ||
  34.           (AttributeDescriptor::getArrayType(attrDescriptor) == ZFIXED_ARRAY)) {
  35.         if (!AttributeDescriptor::getNullable(attrDescriptor)) {
  36.           if (AttributeDescriptor::getSizeInWords(attrDescriptor) == 1) {
  37.             ljam();
  38.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHOneWordNotNULL;
  39.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHOneWordNotNULL;
  40.           } else if (AttributeDescriptor::getSizeInWords(attrDescriptor) == 2) {
  41.             ljam();
  42.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHTwoWordNotNULL;
  43.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHTwoWordNotNULL;
  44.           } else if (AttributeDescriptor::getSizeInWords(attrDescriptor) > 2) {
  45.             ljam();
  46.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHManyWordNotNULL;
  47.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHManyWordNotNULL;
  48.           } else {
  49.             ndbrequire(false);
  50.           }//if
  51.           // replace read function of char attribute
  52.           if (AttributeOffset::getCharsetFlag(attrOffset)) {
  53.             ljam();
  54.             regTabPtr->readFunctionArray[i] = &Dbtup::readCharNotNULL;
  55.           }
  56.         } else {
  57.           if (AttributeDescriptor::getSizeInWords(attrDescriptor) == 1) {
  58.             ljam();
  59.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHOneWordNULLable;
  60.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHManyWordNULLable;
  61.           } else if (AttributeDescriptor::getSizeInWords(attrDescriptor) == 2) {
  62.             ljam();
  63.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHTwoWordNULLable;
  64.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHManyWordNULLable;
  65.           } else if (AttributeDescriptor::getSizeInWords(attrDescriptor) > 2) {
  66.             ljam();
  67.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHManyWordNULLable;
  68.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHManyWordNULLable;
  69.           } else {
  70.             ljam();
  71.             regTabPtr->readFunctionArray[i] = &Dbtup::readFixedSizeTHZeroWordNULLable;
  72.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateFixedSizeTHManyWordNULLable;
  73.           }//if
  74.           // replace read function of char attribute
  75.           if (AttributeOffset::getCharsetFlag(attrOffset)) {
  76.             ljam();
  77.             regTabPtr->readFunctionArray[i] = &Dbtup::readCharNULLable;
  78.           }
  79.         }//if
  80.       } else if (AttributeDescriptor::getArrayType(attrDescriptor) == ZVAR_ARRAY) {
  81.         if (!AttributeDescriptor::getNullable(attrDescriptor)) {
  82.           if (AttributeDescriptor::getArraySize(attrDescriptor) == 0) {
  83.             ljam();
  84.             regTabPtr->readFunctionArray[i] = &Dbtup::readVarSizeUnlimitedNotNULL;
  85.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateVarSizeUnlimitedNotNULL;
  86.           } else if (AttributeDescriptor::getArraySize(attrDescriptor) > ZMAX_SMALL_VAR_ARRAY) {
  87.             ljam();
  88.             regTabPtr->readFunctionArray[i] = &Dbtup::readBigVarSizeNotNULL;
  89.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateBigVarSizeNotNULL;
  90.           } else {
  91.             ljam();
  92.             regTabPtr->readFunctionArray[i] = &Dbtup::readSmallVarSizeNotNULL;
  93.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateSmallVarSizeNotNULL;
  94.           }//if
  95.         } else {
  96.           if (AttributeDescriptor::getArraySize(attrDescriptor) == 0) {
  97.             ljam();
  98.             regTabPtr->readFunctionArray[i] = &Dbtup::readVarSizeUnlimitedNULLable;
  99.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateVarSizeUnlimitedNULLable;
  100.           } else if (AttributeDescriptor::getArraySize(attrDescriptor) > ZMAX_SMALL_VAR_ARRAY) {
  101.             ljam();
  102.             regTabPtr->readFunctionArray[i] = &Dbtup::readBigVarSizeNULLable;
  103.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateBigVarSizeNULLable;
  104.           } else {
  105.             ljam();
  106.             regTabPtr->readFunctionArray[i] = &Dbtup::readSmallVarSizeNULLable;
  107.             regTabPtr->updateFunctionArray[i] = &Dbtup::updateSmallVarSizeNULLable;
  108.           }//if
  109.         }//if
  110.       } else {
  111.         ndbrequire(false);
  112.       }//if
  113.     } else {
  114.       if ((AttributeDescriptor::getArrayType(attrDescriptor) == ZNON_ARRAY) ||
  115.           (AttributeDescriptor::getArrayType(attrDescriptor) == ZFIXED_ARRAY)) {
  116.         ljam();
  117.         regTabPtr->readFunctionArray[i] = &Dbtup::readDynFixedSize;
  118.         regTabPtr->updateFunctionArray[i] = &Dbtup::updateDynFixedSize;
  119.       } else if (AttributeDescriptor::getType(attrDescriptor) == ZVAR_ARRAY) {
  120.         if (AttributeDescriptor::getArraySize(attrDescriptor) == 0) {
  121.           ljam();
  122.           regTabPtr->readFunctionArray[i] = &Dbtup::readDynVarSizeUnlimited;
  123.           regTabPtr->updateFunctionArray[i] = &Dbtup::updateDynVarSizeUnlimited;
  124.         } else if (AttributeDescriptor::getArraySize(attrDescriptor) > ZMAX_SMALL_VAR_ARRAY) {
  125.           ljam();
  126.           regTabPtr->readFunctionArray[i] = &Dbtup::readDynBigVarSize;
  127.           regTabPtr->updateFunctionArray[i] = &Dbtup::updateDynBigVarSize;
  128.         } else {
  129.           ljam();
  130.           regTabPtr->readFunctionArray[i] = &Dbtup::readDynSmallVarSize;
  131.           regTabPtr->updateFunctionArray[i] = &Dbtup::updateDynSmallVarSize;
  132.         }//if
  133.       } else {
  134.         ndbrequire(false);
  135.       }//if
  136.     }//if
  137.   }//for
  138. }//Dbtup::setUpQueryRoutines()
  139. /* ---------------------------------------------------------------- */
  140. /*       THIS ROUTINE IS USED TO READ A NUMBER OF ATTRIBUTES IN THE */
  141. /*       DATABASE AND PLACE THE RESULT IN ATTRINFO RECORDS.         */
  142. //
  143. // In addition to the parameters used in the call it also relies on the
  144. // following variables set-up properly.
  145. //
  146. // operPtr.p      Operation record pointer
  147. // fragptr.p      Fragment record pointer
  148. // tabptr.p       Table record pointer
  149. /* ---------------------------------------------------------------- */
  150. int Dbtup::readAttributes(Page* const pagePtr,
  151.   Uint32  tupHeadOffset,
  152.   const Uint32* inBuffer,
  153.   Uint32  inBufLen,
  154.   Uint32* outBuffer,
  155.   Uint32  maxRead,
  156.   bool    xfrmFlag)
  157. {
  158.   Tablerec* const regTabPtr =  tabptr.p;
  159.   Uint32 numAttributes = regTabPtr->noOfAttr;
  160.   Uint32 attrDescriptorStart = regTabPtr->tabDescriptor;
  161.   Uint32 inBufIndex = 0;
  162.   ndbrequire(attrDescriptorStart + (numAttributes << ZAD_LOG_SIZE) <= cnoOfTabDescrRec);
  163.   tOutBufIndex = 0;
  164.   tCheckOffset = regTabPtr->tupheadsize;
  165.   tMaxRead = maxRead;
  166.   tTupleHeader = &pagePtr->pageWord[tupHeadOffset];
  167.   tXfrmFlag = xfrmFlag;
  168.   ndbrequire(tupHeadOffset + tCheckOffset <= ZWORDS_ON_PAGE);
  169.   while (inBufIndex < inBufLen) {
  170.     Uint32 tmpAttrBufIndex = tOutBufIndex;
  171.     AttributeHeader ahIn(inBuffer[inBufIndex]);
  172.     inBufIndex++;
  173.     Uint32 attributeId = ahIn.getAttributeId();
  174.     Uint32 attrDescriptorIndex = attrDescriptorStart + (attributeId << ZAD_LOG_SIZE);
  175.     ljam();
  176.     AttributeHeader::init(&outBuffer[tmpAttrBufIndex], attributeId, 0);
  177.     AttributeHeader* ahOut = (AttributeHeader*)&outBuffer[tmpAttrBufIndex];
  178.     tOutBufIndex = tmpAttrBufIndex + 1;
  179.     if (attributeId < numAttributes) {
  180.       Uint32 attributeDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr;
  181.       Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr;
  182.       ReadFunction f = regTabPtr->readFunctionArray[attributeId];
  183.       if ((this->*f)(outBuffer,
  184.                      ahOut,
  185.                      attributeDescriptor,
  186.                      attributeOffset)) {
  187.         continue;
  188.       } else {
  189.         return -1;
  190.       }//if
  191.     } else if(attributeId & AttributeHeader::PSUEDO){
  192.       Uint32 sz = read_psuedo(attributeId, 
  193.       outBuffer+tmpAttrBufIndex+1);
  194.       AttributeHeader::init(&outBuffer[tmpAttrBufIndex], attributeId, sz);
  195.       tOutBufIndex = tmpAttrBufIndex + 1 + sz;
  196.     } else {
  197.       terrorCode = ZATTRIBUTE_ID_ERROR;
  198.       return -1;
  199.     }//if
  200.   }//while
  201.   return tOutBufIndex;
  202. }//Dbtup::readAttributes()
  203. #if 0
  204. int Dbtup::readAttributesWithoutHeader(Page* const pagePtr,
  205.                                        Uint32  tupHeadOffset,
  206.                                        Uint32* inBuffer,
  207.                                        Uint32  inBufLen,
  208.                                        Uint32* outBuffer,
  209.                                        Uint32* attrBuffer,
  210.                                        Uint32  maxRead)
  211. {
  212.   Tablerec* const regTabPtr =  tabptr.p;
  213.   Uint32 numAttributes = regTabPtr->noOfAttr;
  214.   Uint32 attrDescriptorStart = regTabPtr->tabDescriptor;
  215.   Uint32 inBufIndex = 0;
  216.   Uint32 attrBufIndex = 0;
  217.   ndbrequire(attrDescriptorStart + (numAttributes << ZAD_LOG_SIZE) <= cnoOfTabDescrRec);
  218.   tOutBufIndex = 0;
  219.   tCheckOffset = regTabPtr->tupheadsize;
  220.   tMaxRead = maxRead;
  221.   tTupleHeader = &pagePtr->pageWord[tupHeadOffset];
  222.   ndbrequire(tupHeadOffset + tCheckOffset <= ZWORDS_ON_PAGE);
  223.   while (inBufIndex < inBufLen) {
  224.     AttributeHeader ahIn(inBuffer[inBufIndex]);
  225.     inBufIndex++;
  226.     Uint32 attributeId = ahIn.getAttributeId();
  227.     Uint32 attrDescriptorIndex = attrDescriptorStart + (attributeId << ZAD_LOG_SIZE);
  228.     ljam();
  229.     AttributeHeader::init(&attrBuffer[attrBufIndex], attributeId, 0);
  230.     AttributeHeader* ahOut = (AttributeHeader*)&attrBuffer[attrBufIndex];
  231.     attrBufIndex++;
  232.     if (attributeId < numAttributes) {
  233.       Uint32 attributeDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr;
  234.       Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr;
  235.       ReadFunction f = regTabPtr->readFunctionArray[attributeId];
  236.       if ((this->*f)(outBuffer,
  237.                      ahOut,
  238.                      attributeDescriptor,
  239.                      attributeOffset)) {
  240.         continue;
  241.       } else {
  242.         return -1;
  243.       }//if
  244.     } else {
  245.       terrorCode = ZATTRIBUTE_ID_ERROR;
  246.       return -1;
  247.     }//if
  248.   }//while
  249.   ndbrequire(attrBufIndex == inBufLen);
  250.   return tOutBufIndex;
  251. }//Dbtup::readAttributes()
  252. #endif
  253. bool
  254. Dbtup::readFixedSizeTHOneWordNotNULL(Uint32* outBuffer,
  255.                                      AttributeHeader* ahOut,
  256.                                      Uint32  attrDescriptor,
  257.                                      Uint32  attrDes2)
  258. {
  259.   Uint32 indexBuf = tOutBufIndex;
  260.   Uint32 readOffset = AttributeOffset::getOffset(attrDes2);
  261.   Uint32 const wordRead = tTupleHeader[readOffset];
  262.   Uint32 newIndexBuf = indexBuf + 1;
  263.   Uint32 maxRead = tMaxRead;
  264.   ndbrequire(readOffset < tCheckOffset);
  265.   if (newIndexBuf <= maxRead) {
  266.     ljam();
  267.     outBuffer[indexBuf] = wordRead;
  268.     ahOut->setDataSize(1);
  269.     tOutBufIndex = newIndexBuf;
  270.     return true;
  271.   } else {
  272.     ljam();
  273.     terrorCode = ZTRY_TO_READ_TOO_MUCH_ERROR;
  274.     return false;
  275.   }//if
  276. }//Dbtup::readFixedSizeTHOneWordNotNULL()
  277. bool
  278. Dbtup::readFixedSizeTHTwoWordNotNULL(Uint32* outBuffer,
  279.                                      AttributeHeader* ahOut,
  280.                                      Uint32  attrDescriptor,
  281.                                      Uint32  attrDes2)
  282. {
  283.   Uint32 indexBuf = tOutBufIndex;
  284.   Uint32 readOffset = AttributeOffset::getOffset(attrDes2);
  285.   Uint32 const wordReadFirst = tTupleHeader[readOffset];
  286.   Uint32 const wordReadSecond = tTupleHeader[readOffset + 1];
  287.   Uint32 newIndexBuf = indexBuf + 2;
  288.   Uint32 maxRead = tMaxRead;
  289.   ndbrequire(readOffset + 1 < tCheckOffset);
  290.   if (newIndexBuf <= maxRead) {
  291.     ljam();
  292.     ahOut->setDataSize(2);
  293.     outBuffer[indexBuf] = wordReadFirst;
  294.     outBuffer[indexBuf + 1] = wordReadSecond;
  295.     tOutBufIndex = newIndexBuf;
  296.     return true;
  297.   } else {
  298.     ljam();
  299.     terrorCode = ZTRY_TO_READ_TOO_MUCH_ERROR;
  300.     return false;
  301.   }//if
  302. }//Dbtup::readFixedSizeTHTwoWordNotNULL()
  303. bool
  304. Dbtup::readFixedSizeTHManyWordNotNULL(Uint32* outBuffer,
  305.                                       AttributeHeader* ahOut,
  306.                                       Uint32  attrDescriptor,
  307.                                       Uint32  attrDes2)
  308. {
  309.   Uint32 indexBuf = tOutBufIndex;
  310.   Uint32 readOffset = AttributeOffset::getOffset(attrDes2);
  311.   Uint32 attrNoOfWords = AttributeDescriptor::getSizeInWords(attrDescriptor);
  312.   Uint32 newIndexBuf = indexBuf + attrNoOfWords;
  313.   Uint32 maxRead = tMaxRead;
  314.   ndbrequire((readOffset + attrNoOfWords - 1) < tCheckOffset);
  315.   if (newIndexBuf <= maxRead) {
  316.     ljam();
  317.     ahOut->setDataSize(attrNoOfWords);
  318.     MEMCOPY_NO_WORDS(&outBuffer[indexBuf],
  319.                      &tTupleHeader[readOffset],
  320.                      attrNoOfWords);
  321.     tOutBufIndex = newIndexBuf;
  322.     return true;
  323.   } else {
  324.     ljam();
  325.     terrorCode = ZTRY_TO_READ_TOO_MUCH_ERROR;
  326.     return false;
  327.   }//if
  328. }//Dbtup::readFixedSizeTHManyWordNotNULL()
  329. bool
  330. Dbtup::readFixedSizeTHOneWordNULLable(Uint32* outBuffer,
  331.                                       AttributeHeader* ahOut,
  332.                                       Uint32  attrDescriptor,
  333.                                       Uint32  attrDes2)
  334. {
  335.   if (!nullFlagCheck(attrDes2)) {
  336.     ljam();
  337.     return readFixedSizeTHOneWordNotNULL(outBuffer,
  338.                                          ahOut,
  339.                                          attrDescriptor,
  340.                                          attrDes2);
  341.   } else {
  342.     ljam();
  343.     ahOut->setNULL();
  344.     return true;
  345.   }//if
  346. }//Dbtup::readFixedSizeTHOneWordNULLable()
  347. bool
  348. Dbtup::readFixedSizeTHTwoWordNULLable(Uint32* outBuffer,
  349.                                       AttributeHeader* ahOut,
  350.                                       Uint32  attrDescriptor,
  351.                                       Uint32  attrDes2)
  352. {
  353.   if (!nullFlagCheck(attrDes2)) {
  354.     ljam();
  355.     return readFixedSizeTHTwoWordNotNULL(outBuffer,
  356.                                          ahOut,
  357.                                          attrDescriptor,
  358.                                          attrDes2);
  359.   } else {
  360.     ljam();
  361.     ahOut->setNULL();
  362.     return true;
  363.   }//if
  364. }//Dbtup::readFixedSizeTHTwoWordNULLable()
  365. bool
  366. Dbtup::readFixedSizeTHManyWordNULLable(Uint32* outBuffer,
  367.                                        AttributeHeader* ahOut,
  368.                                        Uint32  attrDescriptor,
  369.                                        Uint32  attrDes2)
  370. {
  371. ljam();
  372.   if (!nullFlagCheck(attrDes2)) {
  373.     ljam();
  374.     return readFixedSizeTHManyWordNotNULL(outBuffer,
  375.                                           ahOut,
  376.                                           attrDescriptor,
  377.                                           attrDes2);
  378.   } else {
  379.     ljam();
  380.     ahOut->setNULL();
  381.     return true;
  382.   }//if
  383. }//Dbtup::readFixedSizeTHManyWordNULLable()
  384. bool
  385. Dbtup::readFixedSizeTHZeroWordNULLable(Uint32* outBuffer,
  386.                                        AttributeHeader* ahOut,
  387.                                        Uint32  attrDescriptor,
  388.                                        Uint32  attrDes2)
  389. {
  390.   ljam();
  391.   if (nullFlagCheck(attrDes2)) {
  392.     ljam();
  393.     ahOut->setNULL();
  394.   }//if
  395.   return true;
  396. }//Dbtup::readFixedSizeTHZeroWordNULLable()
  397. bool
  398. Dbtup::nullFlagCheck(Uint32  attrDes2)
  399. {
  400.   Tablerec* const regTabPtr = tabptr.p;
  401.   Uint32 nullFlagOffsetInTuple = AttributeOffset::getNullFlagOffset(attrDes2);
  402.   ndbrequire(nullFlagOffsetInTuple < regTabPtr->tupNullWords);
  403.   nullFlagOffsetInTuple += regTabPtr->tupNullIndex;
  404.   ndbrequire(nullFlagOffsetInTuple < tCheckOffset);
  405.   return (AttributeOffset::isNULL(tTupleHeader[nullFlagOffsetInTuple], attrDes2));
  406. }//Dbtup::nullFlagCheck()
  407. bool
  408. Dbtup::readVariableSizedAttr(Uint32* outBuffer,
  409.                              AttributeHeader* ahOut,
  410.                              Uint32  attrDescriptor,
  411.                              Uint32  attrDes2)
  412. {
  413.   ljam();
  414.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  415.   return false;
  416. }//Dbtup::readVariableSizedAttr()
  417. bool
  418. Dbtup::readVarSizeUnlimitedNotNULL(Uint32* outBuffer,
  419.                                    AttributeHeader* ahOut,
  420.                                    Uint32  attrDescriptor,
  421.                                    Uint32  attrDes2)
  422. {
  423.   ljam();
  424.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  425.   return false;
  426. }//Dbtup::readVarSizeUnlimitedNotNULL()
  427. bool
  428. Dbtup::readVarSizeUnlimitedNULLable(Uint32* outBuffer,
  429.                                     AttributeHeader* ahOut,
  430.                                     Uint32  attrDescriptor,
  431.                                     Uint32  attrDes2)
  432. {
  433.   ljam();
  434.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  435.   return false;
  436. }//Dbtup::readVarSizeUnlimitedNULLable()
  437. bool
  438. Dbtup::readBigVarSizeNotNULL(Uint32* outBuffer,
  439.                              AttributeHeader* ahOut,
  440.                              Uint32  attrDescriptor,
  441.                              Uint32  attrDes2)
  442. {
  443.   ljam();
  444.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  445.   return false;
  446. }//Dbtup::readBigVarSizeNotNULL()
  447. bool
  448. Dbtup::readBigVarSizeNULLable(Uint32* outBuffer,
  449.                              AttributeHeader* ahOut,
  450.                              Uint32  attrDescriptor,
  451.                              Uint32  attrDes2)
  452. {
  453.   ljam();
  454.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  455.   return false;
  456. }//Dbtup::readBigVarSizeNULLable()
  457. bool
  458. Dbtup::readSmallVarSizeNotNULL(Uint32* outBuffer,
  459.                                AttributeHeader* ahOut,
  460.                                Uint32  attrDescriptor,
  461.                                Uint32  attrDes2)
  462. {
  463.   ljam();
  464.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  465.   return false;
  466. }//Dbtup::readSmallVarSizeNotNULL()
  467. bool
  468. Dbtup::readSmallVarSizeNULLable(Uint32* outBuffer,
  469.                                 AttributeHeader* ahOut,
  470.                                 Uint32  attrDescriptor,
  471.                                 Uint32  attrDes2)
  472. {
  473.   ljam();
  474.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  475.   return false;
  476. }//Dbtup::readSmallVarSizeNULLable()
  477. bool
  478. Dbtup::readDynFixedSize(Uint32* outBuffer,
  479.                         AttributeHeader* ahOut,
  480.                         Uint32  attrDescriptor,
  481.                         Uint32  attrDes2)
  482. {
  483.   ljam();
  484.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  485.   return false;
  486. }//Dbtup::readDynFixedSize()
  487. bool
  488. Dbtup::readDynVarSizeUnlimited(Uint32* outBuffer,
  489.                                AttributeHeader* ahOut,
  490.                                Uint32  attrDescriptor,
  491.                                Uint32  attrDes2)
  492. {
  493.   ljam();
  494.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  495.   return false;
  496. }//Dbtup::readDynVarSizeUnlimited()
  497. bool
  498. Dbtup::readDynBigVarSize(Uint32* outBuffer,
  499.                          AttributeHeader* ahOut,
  500.                          Uint32  attrDescriptor,
  501.                          Uint32  attrDes2)
  502. {
  503.   ljam();
  504.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  505.   return false;
  506. }//Dbtup::readDynBigVarSize()
  507. bool
  508. Dbtup::readDynSmallVarSize(Uint32* outBuffer,
  509.                            AttributeHeader* ahOut,
  510.                            Uint32  attrDescriptor,
  511.                            Uint32  attrDes2)
  512. {
  513.   ljam();
  514.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  515.   return false;
  516. }//Dbtup::readDynSmallVarSize()
  517. bool
  518. Dbtup::readCharNotNULL(Uint32* outBuffer,
  519.                        AttributeHeader* ahOut,
  520.                        Uint32  attrDescriptor,
  521.                        Uint32  attrDes2)
  522. {
  523.   Uint32 indexBuf = tOutBufIndex;
  524.   Uint32 readOffset = AttributeOffset::getOffset(attrDes2);
  525.   Uint32 attrNoOfWords = AttributeDescriptor::getSizeInWords(attrDescriptor);
  526.   Uint32 newIndexBuf = indexBuf + attrNoOfWords;
  527.   Uint32 maxRead = tMaxRead;
  528.   ndbrequire((readOffset + attrNoOfWords - 1) < tCheckOffset);
  529.   if (newIndexBuf <= maxRead) {
  530.     ljam();
  531.     ahOut->setDataSize(attrNoOfWords);
  532.     if (! tXfrmFlag) {
  533.       MEMCOPY_NO_WORDS(&outBuffer[indexBuf],
  534.                        &tTupleHeader[readOffset],
  535.                        attrNoOfWords);
  536.     } else {
  537.       ljam();
  538.       Tablerec* regTabPtr = tabptr.p;
  539.       Uint32 i = AttributeOffset::getCharsetPos(attrDes2);
  540.       ndbrequire(i < tabptr.p->noOfCharsets);
  541.       // not const in MySQL
  542.       CHARSET_INFO* cs = tabptr.p->charsetArray[i];
  543.       // XXX should strip Uint32 null padding
  544.       const unsigned nBytes = attrNoOfWords << 2;
  545.       unsigned n =
  546.       (*cs->coll->strnxfrm)(cs,
  547.                             (uchar*)&outBuffer[indexBuf],
  548.                             nBytes,
  549.                             (const uchar*)&tTupleHeader[readOffset],
  550.                             nBytes);
  551.       // pad with ascii spaces
  552.       while (n < nBytes)
  553.         ((uchar*)&outBuffer[indexBuf])[n++] = 0x20;
  554.     }
  555.     tOutBufIndex = newIndexBuf;
  556.     return true;
  557.   } else {
  558.     ljam();
  559.     terrorCode = ZTRY_TO_READ_TOO_MUCH_ERROR;
  560.     return false;
  561.   }
  562. }
  563. bool
  564. Dbtup::readCharNULLable(Uint32* outBuffer,
  565.                        AttributeHeader* ahOut,
  566.                        Uint32  attrDescriptor,
  567.                        Uint32  attrDes2)
  568. {
  569.   if (!nullFlagCheck(attrDes2)) {
  570.     ljam();
  571.     return readCharNotNULL(outBuffer,
  572.                            ahOut,
  573.                            attrDescriptor,
  574.                            attrDes2);
  575.   } else {
  576.     ljam();
  577.     ahOut->setNULL();
  578.     return true;
  579.   }
  580. }
  581. /* ---------------------------------------------------------------------- */
  582. /*       THIS ROUTINE IS USED TO UPDATE A NUMBER OF ATTRIBUTES. IT IS     */
  583. /*       USED BY THE INSERT ROUTINE, THE UPDATE ROUTINE AND IT CAN BE     */
  584. /*       CALLED SEVERAL TIMES FROM THE INTERPRETER.                       */
  585. // In addition to the parameters used in the call it also relies on the
  586. // following variables set-up properly.
  587. //
  588. // pagep.p        Page record pointer
  589. // fragptr.p      Fragment record pointer
  590. // operPtr.p      Operation record pointer
  591. // tabptr.p       Table record pointer
  592. /* ---------------------------------------------------------------------- */
  593. int Dbtup::updateAttributes(Page* const pagePtr,
  594.                             Uint32 tupHeadOffset,
  595.                             Uint32* inBuffer,
  596.                             Uint32 inBufLen)
  597. {
  598.   Tablerec* const regTabPtr =  tabptr.p;
  599.   Operationrec* const regOperPtr = operPtr.p;
  600.   Uint32 numAttributes = regTabPtr->noOfAttr;
  601.   Uint32 attrDescriptorStart = regTabPtr->tabDescriptor;
  602.   ndbrequire(attrDescriptorStart + (numAttributes << ZAD_LOG_SIZE) <= cnoOfTabDescrRec);
  603.   tCheckOffset = regTabPtr->tupheadsize;
  604.   tTupleHeader = &pagePtr->pageWord[tupHeadOffset];
  605.   Uint32 inBufIndex = 0;
  606.   tInBufIndex = 0;
  607.   tInBufLen = inBufLen;
  608.   ndbrequire(tupHeadOffset + tCheckOffset <= ZWORDS_ON_PAGE);
  609.   while (inBufIndex < inBufLen) {
  610.     AttributeHeader ahIn(inBuffer[inBufIndex]);
  611.     Uint32 attributeId = ahIn.getAttributeId();
  612.     Uint32 attrDescriptorIndex = attrDescriptorStart + (attributeId << ZAD_LOG_SIZE);
  613.     if (attributeId < numAttributes) {
  614.       Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr;
  615.       Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr;
  616.       if ((AttributeDescriptor::getPrimaryKey(attrDescriptor)) &&
  617.           (regOperPtr->optype != ZINSERT)) {
  618.         if (checkUpdateOfPrimaryKey(&inBuffer[inBufIndex], regTabPtr)) {
  619.           ljam();
  620.           terrorCode = ZTRY_UPDATE_PRIMARY_KEY;
  621.           return -1;
  622.         }//if
  623.       }//if
  624.       UpdateFunction f = regTabPtr->updateFunctionArray[attributeId];
  625.       ljam();
  626.       regOperPtr->changeMask.set(attributeId);
  627.       if ((this->*f)(inBuffer,
  628.                      attrDescriptor,
  629.                      attributeOffset)) {
  630.         inBufIndex = tInBufIndex;
  631.         continue;
  632.       } else {
  633.         ljam();
  634.         return -1;
  635.       }//if
  636.     } else {
  637.       ljam();
  638.       terrorCode = ZATTRIBUTE_ID_ERROR;
  639.       return -1;
  640.     }//if
  641.   }//while
  642.   return 0;
  643. }//Dbtup::updateAttributes()
  644. bool
  645. Dbtup::checkUpdateOfPrimaryKey(Uint32* updateBuffer, Tablerec* const regTabPtr)
  646. {
  647.   Uint32 keyReadBuffer[MAX_KEY_SIZE_IN_WORDS];
  648.   Uint32 attributeHeader;
  649.   AttributeHeader* ahOut = (AttributeHeader*)&attributeHeader;
  650.   AttributeHeader ahIn(*updateBuffer);
  651.   Uint32 attributeId = ahIn.getAttributeId();
  652.   Uint32 attrDescriptorIndex = regTabPtr->tabDescriptor + (attributeId << ZAD_LOG_SIZE);
  653.   Uint32 attrDescriptor = tableDescriptor[attrDescriptorIndex].tabDescr;
  654.   Uint32 attributeOffset = tableDescriptor[attrDescriptorIndex + 1].tabDescr;
  655.   Uint32 xfrmBuffer[1 + MAX_KEY_SIZE_IN_WORDS * 1]; // strxfrm_multiply == 1
  656.   Uint32 charsetFlag = AttributeOffset::getCharsetFlag(attributeOffset);
  657.   if (charsetFlag) {
  658.     Uint32 csPos = AttributeOffset::getCharsetPos(attributeOffset);
  659.     CHARSET_INFO* cs = regTabPtr->charsetArray[csPos];
  660.     Uint32 sizeInBytes = AttributeDescriptor::getSizeInBytes(attrDescriptor);
  661.     Uint32 sizeInWords = AttributeDescriptor::getSizeInWords(attrDescriptor);
  662.     const uchar* srcPtr = (uchar*)&updateBuffer[1];
  663.     uchar* dstPtr = (uchar*)&xfrmBuffer[1];
  664.     Uint32 n =
  665.       (*cs->coll->strnxfrm)(cs, dstPtr, sizeInBytes, srcPtr, sizeInBytes);
  666.     // pad with blanks (unlikely) and zeroes to match NDB API behaviour
  667.     while (n < sizeInBytes)
  668.       dstPtr[n++] = 0x20;
  669.     while (n < 4 * sizeInWords)
  670.       dstPtr[n++] = 0;
  671.     xfrmBuffer[0] = ahIn.m_value;
  672.     updateBuffer = xfrmBuffer;
  673.   }
  674.   ReadFunction f = regTabPtr->readFunctionArray[attributeId];
  675.   AttributeHeader::init(&attributeHeader, attributeId, 0);
  676.   tOutBufIndex = 0;
  677.   tMaxRead = MAX_KEY_SIZE_IN_WORDS;
  678.   bool tmp = tXfrmFlag;
  679.   tXfrmFlag = true;
  680.   ndbrequire((this->*f)(&keyReadBuffer[0], ahOut, attrDescriptor, attributeOffset));
  681.   tXfrmFlag = tmp;
  682.   ndbrequire(tOutBufIndex == ahOut->getDataSize());
  683.   if (ahIn.getDataSize() != ahOut->getDataSize()) {
  684.     ljam();
  685.     return true;
  686.   }//if
  687.   if (memcmp(&keyReadBuffer[0], &updateBuffer[1], tOutBufIndex << 2) != 0) {
  688.     ljam();
  689.     return true;
  690.   }//if
  691.   return false;
  692. }//Dbtup::checkUpdateOfPrimaryKey()
  693. #if 0
  694. void Dbtup::checkPages(Fragrecord* const regFragPtr)
  695. {
  696.   Uint32 noPages = getNoOfPages(regFragPtr);
  697.   for (Uint32 i = 0; i < noPages ; i++) {
  698.     PagePtr pagePtr;
  699.     pagePtr.i = getRealpid(regFragPtr, i);
  700.     ptrCheckGuard(pagePtr, cnoOfPage, page);
  701.     ndbrequire(pagePtr.p->pageWord[1] != (RNIL - 1));
  702.   }
  703. }
  704. #endif
  705. bool
  706. Dbtup::updateFixedSizeTHOneWordNotNULL(Uint32* inBuffer,
  707.                                        Uint32  attrDescriptor,
  708.                                        Uint32  attrDes2)
  709. {
  710.   Uint32 indexBuf = tInBufIndex;
  711.   Uint32 inBufLen = tInBufLen;
  712.   Uint32 updateOffset = AttributeOffset::getOffset(attrDes2);
  713.   AttributeHeader ahIn(inBuffer[indexBuf]);
  714.   Uint32 nullIndicator = ahIn.isNULL();
  715.   Uint32 newIndex = indexBuf + 2;
  716.   ndbrequire(updateOffset < tCheckOffset);
  717.   if (newIndex <= inBufLen) {
  718.     Uint32 updateWord = inBuffer[indexBuf + 1];
  719.     if (!nullIndicator) {
  720.       ljam();
  721.       tInBufIndex = newIndex;
  722.       tTupleHeader[updateOffset] = updateWord;
  723.       return true;
  724.     } else {
  725.       ljam();
  726.       terrorCode = ZNOT_NULL_ATTR;
  727.       return false;
  728.     }//if
  729.   } else {
  730.     ljam();
  731.     terrorCode = ZAI_INCONSISTENCY_ERROR;
  732.     return false;
  733.   }//if
  734.   return true;
  735. }//Dbtup::updateFixedSizeTHOneWordNotNULL()
  736. bool
  737. Dbtup::updateFixedSizeTHTwoWordNotNULL(Uint32* inBuffer,
  738.                                        Uint32  attrDescriptor,
  739.                                        Uint32  attrDes2)
  740. {
  741.   Uint32 indexBuf = tInBufIndex;
  742.   Uint32 inBufLen = tInBufLen;
  743.   Uint32 updateOffset = AttributeOffset::getOffset(attrDes2);
  744.   AttributeHeader ahIn(inBuffer[indexBuf]);
  745.   Uint32 nullIndicator = ahIn.isNULL();
  746.   Uint32 newIndex = indexBuf + 3;
  747.   ndbrequire((updateOffset + 1) < tCheckOffset);
  748.   if (newIndex <= inBufLen) {
  749.     Uint32 updateWord1 = inBuffer[indexBuf + 1];
  750.     Uint32 updateWord2 = inBuffer[indexBuf + 2];
  751.     if (!nullIndicator) {
  752.       ljam();
  753.       tInBufIndex = newIndex;
  754.       tTupleHeader[updateOffset] = updateWord1;
  755.       tTupleHeader[updateOffset + 1] = updateWord2;
  756.       return true;
  757.     } else {
  758.       ljam();
  759.       terrorCode = ZNOT_NULL_ATTR;
  760.       return false;
  761.     }//if
  762.   } else {
  763.     ljam();
  764.     terrorCode = ZAI_INCONSISTENCY_ERROR;
  765.     return false;
  766.   }//if
  767. }//Dbtup::updateFixedSizeTHTwoWordNotNULL()
  768. bool
  769. Dbtup::updateFixedSizeTHManyWordNotNULL(Uint32* inBuffer,
  770.                                         Uint32  attrDescriptor,
  771.                                         Uint32  attrDes2)
  772. {
  773.   Uint32 indexBuf = tInBufIndex;
  774.   Uint32 inBufLen = tInBufLen;
  775.   Uint32 updateOffset = AttributeOffset::getOffset(attrDes2);
  776.   AttributeHeader ahIn(inBuffer[indexBuf]);
  777.   Uint32 nullIndicator = ahIn.isNULL();
  778.   Uint32 noOfWords = AttributeDescriptor::getSizeInWords(attrDescriptor);
  779.   Uint32 newIndex = indexBuf + noOfWords + 1;
  780.   ndbrequire((updateOffset + noOfWords - 1) < tCheckOffset);
  781.   if (newIndex <= inBufLen) {
  782.     if (!nullIndicator) {
  783.       ljam();
  784.       tInBufIndex = newIndex;
  785.       MEMCOPY_NO_WORDS(&tTupleHeader[updateOffset],
  786.                        &inBuffer[indexBuf + 1],
  787.                        noOfWords);
  788.       return true;
  789.     } else {
  790.       ljam();
  791.       terrorCode = ZNOT_NULL_ATTR;
  792.       return false;
  793.     }//if
  794.   } else {
  795.     ljam();
  796.     terrorCode = ZAI_INCONSISTENCY_ERROR;
  797.     return false;
  798.   }//if
  799. }//Dbtup::updateFixedSizeTHManyWordNotNULL()
  800. bool
  801. Dbtup::updateFixedSizeTHManyWordNULLable(Uint32* inBuffer,
  802.                                          Uint32  attrDescriptor,
  803.                                          Uint32  attrDes2)
  804. {
  805.   Tablerec* const regTabPtr =  tabptr.p;
  806.   AttributeHeader ahIn(inBuffer[tInBufIndex]);
  807.   Uint32 nullIndicator = ahIn.isNULL();
  808.   Uint32 nullFlagOffset = AttributeOffset::getNullFlagOffset(attrDes2);
  809.   Uint32 nullFlagBitOffset = AttributeOffset::getNullFlagBitOffset(attrDes2);
  810.   Uint32 nullWordOffset = nullFlagOffset + regTabPtr->tupNullIndex;
  811.   ndbrequire((nullFlagOffset < regTabPtr->tupNullWords) &&
  812.              (nullWordOffset < tCheckOffset));
  813.   Uint32 nullBits = tTupleHeader[nullWordOffset];
  814.   if (!nullIndicator) {
  815.     nullBits &= (~(1 << nullFlagBitOffset));
  816.     ljam();
  817.     tTupleHeader[nullWordOffset] = nullBits;
  818.     return updateFixedSizeTHManyWordNotNULL(inBuffer,
  819.                                             attrDescriptor,
  820.                                             attrDes2);
  821.   } else {
  822.     Uint32 newIndex = tInBufIndex + 1;
  823.     if (newIndex <= tInBufLen) {
  824.       nullBits |= (1 << nullFlagBitOffset);
  825.       ljam();
  826.       tTupleHeader[nullWordOffset] = nullBits;
  827.       tInBufIndex = newIndex;
  828.       return true;
  829.     } else {
  830.       ljam();
  831.       terrorCode = ZAI_INCONSISTENCY_ERROR;
  832.       return false;
  833.     }//if
  834.   }//if
  835. }//Dbtup::updateFixedSizeTHManyWordNULLable()
  836. bool
  837. Dbtup::updateVariableSizedAttr(Uint32* inBuffer,
  838.                                Uint32  attrDescriptor,
  839.                                Uint32  attrDes2)
  840. {
  841.   ljam();
  842.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  843.   return false;
  844. }//Dbtup::updateVariableSizedAttr()
  845. bool
  846. Dbtup::updateVarSizeUnlimitedNotNULL(Uint32* inBuffer,
  847.                                      Uint32  attrDescriptor,
  848.                                      Uint32  attrDes2)
  849. {
  850.   ljam();
  851.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  852.   return false;
  853. }//Dbtup::updateVarSizeUnlimitedNotNULL()
  854. bool
  855. Dbtup::updateVarSizeUnlimitedNULLable(Uint32* inBuffer,
  856.                                       Uint32  attrDescriptor,
  857.                                       Uint32  attrDes2)
  858. {
  859.   ljam();
  860.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  861.   return false;
  862. }//Dbtup::updateVarSizeUnlimitedNULLable()
  863. bool
  864. Dbtup::updateBigVarSizeNotNULL(Uint32* inBuffer,
  865.                                Uint32  attrDescriptor,
  866.                                Uint32  attrDes2)
  867. {
  868.   ljam();
  869.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  870.   return false;
  871. }//Dbtup::updateBigVarSizeNotNULL()
  872. bool
  873. Dbtup::updateBigVarSizeNULLable(Uint32* inBuffer,
  874.                                 Uint32  attrDescriptor,
  875.                                 Uint32  attrDes2)
  876. {
  877.   ljam();
  878.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  879.   return false;
  880. }//Dbtup::updateBigVarSizeNULLable()
  881. bool
  882. Dbtup::updateSmallVarSizeNotNULL(Uint32* inBuffer,
  883.                                  Uint32  attrDescriptor,
  884.                                  Uint32  attrDes2)
  885. {
  886.   ljam();
  887.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  888.   return false;
  889. }//Dbtup::updateSmallVarSizeNotNULL()
  890. bool
  891. Dbtup::updateSmallVarSizeNULLable(Uint32* inBuffer,
  892.                                   Uint32  attrDescriptor,
  893.                                   Uint32  attrDes2)
  894. {
  895.   ljam();
  896.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  897.   return false;
  898. }//Dbtup::updateSmallVarSizeNULLable()
  899. bool
  900. Dbtup::updateDynFixedSize(Uint32* inBuffer,
  901.                           Uint32  attrDescriptor,
  902.                           Uint32  attrDes2)
  903. {
  904.   ljam();
  905.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  906.   return false;
  907. }//Dbtup::updateDynFixedSize()
  908. bool
  909. Dbtup::updateDynVarSizeUnlimited(Uint32* inBuffer,
  910.                                  Uint32  attrDescriptor,
  911.                                  Uint32  attrDes2)
  912. {
  913.   ljam();
  914.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  915.   return false;
  916. }//Dbtup::updateDynVarSizeUnlimited()
  917. bool
  918. Dbtup::updateDynBigVarSize(Uint32* inBuffer,
  919.                            Uint32  attrDescriptor,
  920.                            Uint32  attrDes2)
  921. {
  922.   ljam();
  923.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  924.   return false;
  925. }//Dbtup::updateDynBigVarSize()
  926. bool
  927. Dbtup::updateDynSmallVarSize(Uint32* inBuffer,
  928.                              Uint32  attrDescriptor,
  929.                              Uint32  attrDes2)
  930. {
  931.   ljam();
  932.   terrorCode = ZVAR_SIZED_NOT_SUPPORTED;
  933.   return false;
  934. }//Dbtup::updateDynSmallVarSize()
  935. Uint32 
  936. Dbtup::read_psuedo(Uint32 attrId, Uint32* outBuffer){
  937.   Uint32 tmp[sizeof(SignalHeader)+25];
  938.   Signal * signal = (Signal*)&tmp;
  939.   switch(attrId){
  940.   case AttributeHeader::FRAGMENT:
  941.     * outBuffer = operPtr.p->fragId;
  942.     return 1;
  943.   case AttributeHeader::ROW_COUNT:
  944.   case AttributeHeader::COMMIT_COUNT:
  945.     signal->theData[0] = operPtr.p->userpointer;
  946.     signal->theData[1] = attrId;
  947.     EXECUTE_DIRECT(DBLQH, GSN_READ_PSUEDO_REQ, signal, 2);
  948.     outBuffer[0] = signal->theData[0];
  949.     outBuffer[1] = signal->theData[1];
  950.     return 2;
  951.   default:
  952.     return 0;
  953.   }
  954. }