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

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 <signaldata/TupFrag.hpp>
  19. #include <signaldata/FsConf.hpp>
  20. #include <signaldata/FsRemoveReq.hpp>
  21. #include <signaldata/DropTab.hpp>
  22. #include <signaldata/AlterTab.hpp>
  23. #include <AttributeDescriptor.hpp>
  24. #include "AttributeOffset.hpp"
  25. #include <my_sys.h>
  26. #define ljam() { jamLine(20000 + __LINE__); }
  27. #define ljamEntry() { jamEntryLine(20000 + __LINE__); }
  28. /* ---------------------------------------------------------------- */
  29. /* ---------------------------------------------------------------- */
  30. /* --------------- ADD/DROP FRAGMENT TABLE MODULE ----------------- */
  31. /* ---------------------------------------------------------------- */
  32. /* ---------------------------------------------------------------- */
  33. void Dbtup::execTUPFRAGREQ(Signal* signal)
  34. {
  35.   ljamEntry();
  36.   if (signal->theData[0] == (Uint32)-1) {
  37.     ljam();
  38.     abortAddFragOp(signal);
  39.     return;
  40.   }
  41.   FragoperrecPtr fragOperPtr;
  42.   FragrecordPtr regFragPtr;
  43.   TablerecPtr regTabPtr;
  44.   Uint32 userptr = signal->theData[0];
  45.   Uint32 userblockref = signal->theData[1];
  46.   Uint32 reqinfo = signal->theData[2];
  47.   regTabPtr.i = signal->theData[3];
  48.   Uint32 noOfAttributes = signal->theData[4];
  49.   Uint32 fragId = signal->theData[5];
  50.   Uint32 noOfNullAttr = signal->theData[7];
  51.   /*  Uint32 schemaVersion = signal->theData[8];*/
  52.   Uint32 noOfKeyAttr = signal->theData[9];
  53.   Uint32 noOfNewAttr = (signal->theData[10] & 0xFFFF);
  54.   /* DICT sends number of character sets in upper half */
  55.   Uint32 noOfCharsets = (signal->theData[10] >> 16);
  56.   Uint32 checksumIndicator = signal->theData[11];
  57.   Uint32 noOfAttributeGroups = signal->theData[12];
  58.   Uint32 globalCheckpointIdIndicator = signal->theData[13];
  59. #ifndef VM_TRACE
  60.   // config mismatch - do not crash if release compiled
  61.   if (regTabPtr.i >= cnoOfTablerec) {
  62.     ljam();
  63.     signal->theData[0] = userptr;
  64.     signal->theData[1] = 800;
  65.     sendSignal(userblockref, GSN_TUPFRAGREF, signal, 2, JBB);
  66.     return;
  67.   }
  68. #endif
  69.   ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
  70.   if (cfirstfreeFragopr == RNIL) {
  71.     ljam();
  72.     signal->theData[0] = userptr;
  73.     signal->theData[1] = ZNOFREE_FRAGOP_ERROR;
  74.     sendSignal(userblockref, GSN_TUPFRAGREF, signal, 2, JBB);
  75.     return;
  76.   }//if
  77.   seizeFragoperrec(fragOperPtr);
  78.   fragOperPtr.p->nextFragoprec = RNIL;
  79.   fragOperPtr.p->lqhBlockrefFrag = userblockref;
  80.   fragOperPtr.p->lqhPtrFrag = userptr;
  81.   fragOperPtr.p->fragidFrag = fragId;
  82.   fragOperPtr.p->tableidFrag = regTabPtr.i;
  83.   fragOperPtr.p->attributeCount = noOfAttributes;
  84.   fragOperPtr.p->freeNullBit = noOfNullAttr;
  85.   fragOperPtr.p->noOfNewAttrCount = noOfNewAttr;
  86.   fragOperPtr.p->charsetIndex = 0;
  87.   ndbrequire(reqinfo == ZADDFRAG);
  88.   getFragmentrec(regFragPtr, fragId, regTabPtr.p);
  89.   if (regFragPtr.i != RNIL) {
  90.     ljam();
  91.     terrorCode = ZEXIST_FRAG_ERROR; /* THE FRAGMENT ALREADY EXIST */
  92.     fragrefuse1Lab(signal, fragOperPtr);
  93.     return;
  94.   }//if
  95.   if (cfirstfreefrag != RNIL) {
  96.     ljam();
  97.     seizeFragrecord(regFragPtr);
  98.   } else {
  99.     ljam();
  100.     terrorCode = ZFULL_FRAGRECORD_ERROR;
  101.     fragrefuse1Lab(signal, fragOperPtr);
  102.     return;
  103.   }//if
  104.   initFragRange(regFragPtr.p);
  105.   if (!addfragtotab(regTabPtr.p, fragId, regFragPtr.i)) {
  106.     ljam();
  107.     terrorCode = ZNO_FREE_TAB_ENTRY_ERROR;
  108.     fragrefuse2Lab(signal, fragOperPtr, regFragPtr);
  109.     return;
  110.   }//if
  111.   if (cfirstfreerange == RNIL) {
  112.     ljam();
  113.     terrorCode = ZNO_FREE_PAGE_RANGE_ERROR;
  114.     fragrefuse3Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
  115.     return;
  116.   }//if
  117.   regFragPtr.p->emptyPrimPage = RNIL;
  118.   regFragPtr.p->thFreeFirst = RNIL;
  119.   regFragPtr.p->thFreeCopyFirst = RNIL;
  120.   regFragPtr.p->noCopyPagesAlloc = 0;
  121.   regFragPtr.p->fragTableId = regTabPtr.i;
  122.   regFragPtr.p->fragmentId = fragId;
  123.   regFragPtr.p->checkpointVersion = RNIL;
  124.   Uint32 noAllocatedPages = 2;
  125.   noAllocatedPages = allocFragPages(regFragPtr.p, noAllocatedPages);
  126.   if (noAllocatedPages == 0) {
  127.     ljam();
  128.     terrorCode = ZNO_PAGES_ALLOCATED_ERROR;
  129.     fragrefuse3Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
  130.     return;
  131.   }//if
  132.   if (ERROR_INSERTED(4007) && regTabPtr.p->fragid[0] == fragId ||
  133.       ERROR_INSERTED(4008) && regTabPtr.p->fragid[1] == fragId) {
  134.     ljam();
  135.     terrorCode = 1;
  136.     fragrefuse4Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
  137.     CLEAR_ERROR_INSERT_VALUE;
  138.     return;
  139.   }
  140.   if (regTabPtr.p->tableStatus == NOT_DEFINED) {
  141.     ljam();
  142. //-------------------------------------------------------------------------------------
  143. // We are setting up references to the header of the tuple.
  144. // Active operation  This word contains a reference to the operation active on the tuple
  145. //                   at the moment. RNIL means no one active at all.  Not optional.
  146. // Tuple version     Uses only low 16 bits.  Not optional.
  147. // Checksum          The third header word is optional and contains a checksum of the
  148. //                   tuple header.
  149. // Null-bits         A number of words to contain null bits for all non-dynamic attributes.
  150. //                   Each word contains upto 32 null bits. Each time a new word is needed
  151. //                   we allocate the complete word. Zero nullable attributes means that
  152. //                   there is no word at all
  153. // Global Checkpoint id
  154. //                   This word is optional. When used it is stored as a 32-bit unsigned
  155. //                   attribute with attribute identity 0. Thus the kernel assumes that
  156. //                   this is the first word after the header.
  157. //-------------------------------------------------------------------------------------
  158.     fragOperPtr.p->definingFragment = true;
  159.     regTabPtr.p->tableStatus = DEFINING;
  160.     regTabPtr.p->checksumIndicator = (checksumIndicator != 0 ? true : false);
  161.     regTabPtr.p->GCPIndicator = (globalCheckpointIdIndicator != 0 ? true : false);
  162.     regTabPtr.p->tupChecksumIndex = 2;
  163.     regTabPtr.p->tupNullIndex = 2 + (checksumIndicator != 0 ? 1 : 0);
  164.     regTabPtr.p->tupNullWords = (noOfNullAttr + 31) >> 5;
  165.     regTabPtr.p->tupGCPIndex = regTabPtr.p->tupNullIndex + regTabPtr.p->tupNullWords;
  166.     regTabPtr.p->tupheadsize = regTabPtr.p->tupGCPIndex;
  167.     regTabPtr.p->noOfKeyAttr = noOfKeyAttr;
  168.     regTabPtr.p->noOfCharsets = noOfCharsets;
  169.     regTabPtr.p->noOfAttr = noOfAttributes;
  170.     regTabPtr.p->noOfNewAttr = noOfNewAttr;
  171.     regTabPtr.p->noOfNullAttr = noOfNullAttr;
  172.     regTabPtr.p->noOfAttributeGroups = noOfAttributeGroups;
  173.     regTabPtr.p->notNullAttributeMask.clear();
  174.     Uint32 offset[10];
  175.     Uint32 tableDescriptorRef = allocTabDescr(regTabPtr.p, offset);
  176.     if (tableDescriptorRef == RNIL) {
  177.       ljam();
  178.       fragrefuse4Lab(signal, fragOperPtr, regFragPtr, regTabPtr.p, fragId);
  179.       return;
  180.     }//if
  181.     setUpDescriptorReferences(tableDescriptorRef, regTabPtr.p, offset);
  182.   } else {
  183.     ljam();
  184.     fragOperPtr.p->definingFragment = false;
  185.   }//if
  186.   signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
  187.   signal->theData[1] = fragOperPtr.i;
  188.   signal->theData[2] = regFragPtr.i;
  189.   signal->theData[3] = fragId;
  190.   sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUPFRAGCONF, signal, 4, JBB);
  191.   return;
  192. }//Dbtup::execTUPFRAGREQ()
  193. /* -------------------------------------------------------------------- */
  194. /* ------------------------- ADDFRAGTOTAB ----------------------------- */
  195. /* PUTS A FRAGMENT POINTER AND FID IN THE TABLE ARRAY OF THE TID RECORD */
  196. /* -------------------------------------------------------------------- */
  197. bool Dbtup::addfragtotab(Tablerec* const regTabPtr, Uint32 fragId, Uint32 fragIndex) 
  198. {
  199.   for (Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE); i++) {
  200.     ljam();
  201.     if (regTabPtr->fragid[i] == RNIL) {
  202.       ljam();
  203.       regTabPtr->fragid[i] = fragId;
  204.       regTabPtr->fragrec[i] = fragIndex;
  205.       return true;
  206.     }//if
  207.   }//for
  208.   return false;
  209. }//Dbtup::addfragtotab()
  210. void Dbtup::getFragmentrec(FragrecordPtr& regFragPtr, Uint32 fragId, Tablerec* const regTabPtr) 
  211. {
  212.   for (Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE); i++) {
  213.     ljam();
  214.     if (regTabPtr->fragid[i] == fragId) {
  215.       ljam();
  216. /* ---------------------------------------------------------------- */
  217. /* A FRAGMENT  RECORD HAVE BEEN FOUND FOR THIS OPERATION.           */
  218. /* ---------------------------------------------------------------- */
  219.       regFragPtr.i = regTabPtr->fragrec[i];
  220.       ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);
  221.       return;
  222.     }//if
  223.   }//for
  224.   regFragPtr.i = RNIL;
  225.   ptrNull(regFragPtr);
  226. }//Dbtup::getFragmentrec()
  227. void Dbtup::seizeFragrecord(FragrecordPtr& regFragPtr) 
  228. {
  229.   regFragPtr.i = cfirstfreefrag;
  230.   ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);
  231.   cfirstfreefrag = regFragPtr.p->nextfreefrag;
  232.   regFragPtr.p->nextfreefrag = RNIL;
  233. }//Dbtup::seizeFragrecord()
  234. /* ---------------------------------------------------------------- */
  235. /* SEIZE A FRAGMENT OPERATION RECORD                                */
  236. /* ---------------------------------------------------------------- */
  237. void Dbtup::seizeFragoperrec(FragoperrecPtr& fragOperPtr) 
  238. {
  239.   fragOperPtr.i = cfirstfreeFragopr;
  240.   ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
  241.   cfirstfreeFragopr = fragOperPtr.p->nextFragoprec;
  242.   fragOperPtr.p->nextFragoprec = RNIL;
  243.   fragOperPtr.p->inUse = true;
  244. }//Dbtup::seizeFragoperrec()
  245. /* **************************************************************** */
  246. /* **************          TUP_ADD_ATTRREQ       ****************** */
  247. /* **************************************************************** */
  248. void Dbtup::execTUP_ADD_ATTRREQ(Signal* signal)
  249. {
  250.   FragrecordPtr regFragPtr;
  251.   FragoperrecPtr fragOperPtr;
  252.   TablerecPtr regTabPtr;
  253.   ljamEntry();
  254.   fragOperPtr.i = signal->theData[0];
  255.   ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
  256.   Uint32 attrId = signal->theData[2];
  257.   Uint32 attrDescriptor = signal->theData[3];
  258.   // DICT sends extended type (ignored) and charset number
  259.   Uint32 extType = (signal->theData[4] & 0xFF);
  260.   Uint32 csNumber = (signal->theData[4] >> 16);
  261.   regTabPtr.i = fragOperPtr.p->tableidFrag;
  262.   ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
  263.   Uint32 fragId = fragOperPtr.p->fragidFrag;
  264.   getFragmentrec(regFragPtr, fragId, regTabPtr.p);
  265.   ndbrequire(regFragPtr.i != RNIL);
  266.   ndbrequire(fragOperPtr.p->attributeCount > 0);
  267.   fragOperPtr.p->attributeCount--;
  268.   const bool lastAttr = (fragOperPtr.p->attributeCount == 0);
  269.   if ((regTabPtr.p->tableStatus == DEFINING) &&
  270.       (fragOperPtr.p->definingFragment)) {
  271.     ljam();
  272.     Uint32 firstTabDesIndex = regTabPtr.p->tabDescriptor + (attrId * ZAD_SIZE);
  273.     setTabDescrWord(firstTabDesIndex, attrDescriptor);
  274.     Uint32 attrLen = AttributeDescriptor::getSize(attrDescriptor);
  275.     Uint32 nullBitPos = 0;                  /* Default pos for NOT NULL attributes */
  276.     if (AttributeDescriptor::getNullable(attrDescriptor)) {
  277.       if (!AttributeDescriptor::getDynamic(attrDescriptor)) {
  278.         ljam();                                                      /* NULL ATTR */
  279.         fragOperPtr.p->freeNullBit--;                            /* STORE NULL BIT POSTITION */
  280.         nullBitPos = fragOperPtr.p->freeNullBit;
  281.         ndbrequire(fragOperPtr.p->freeNullBit < ZNIL);               /* Check not below zero */
  282.       }//if
  283.     } else {
  284.       ljam();
  285.       regTabPtr.p->notNullAttributeMask.set(attrId);
  286.     }//if
  287.     Uint32 attrDes2 = 0;
  288.     if (!AttributeDescriptor::getDynamic(attrDescriptor)) {
  289.       ljam();
  290.       Uint32 attributePos = regTabPtr.p->tupheadsize;
  291.       switch (AttributeDescriptor::getArrayType(attrDescriptor)) {
  292.       case 1:
  293.       case 2:
  294.       {
  295.         ljam();
  296.         Uint32 bitsUsed = AttributeDescriptor::getArraySize(attrDescriptor) * (1 << attrLen);
  297.         regTabPtr.p->tupheadsize += ((bitsUsed + 31) >> 5);
  298.         break;
  299.       }
  300.       default:
  301.         ndbrequire(false);
  302.         break;
  303.       }//switch
  304.       AttributeOffset::setOffset(attrDes2, attributePos);
  305.       AttributeOffset::setNullFlagPos(attrDes2, nullBitPos);
  306.     } else {
  307.       ndbrequire(false);
  308.     }//if
  309.     if (csNumber != 0) { 
  310.       CHARSET_INFO* cs = get_charset(csNumber, MYF(0));
  311.       if (cs == NULL) {
  312.         ljam();
  313.         terrorCode = TupAddAttrRef::InvalidCharset;
  314.         addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
  315.         return;
  316.       }
  317.       Uint32 i = 0;
  318.       while (i < fragOperPtr.p->charsetIndex) {
  319.         ljam();
  320.         if (regTabPtr.p->charsetArray[i] == cs)
  321.           break;
  322.         i++;
  323.       }
  324.       if (i == fragOperPtr.p->charsetIndex) {
  325.         ljam();
  326.         fragOperPtr.p->charsetIndex++;
  327.       }
  328.       ndbrequire(i < regTabPtr.p->noOfCharsets);
  329.       regTabPtr.p->charsetArray[i] = cs;
  330.       AttributeOffset::setCharsetPos(attrDes2, i);
  331.     }
  332.     setTabDescrWord(firstTabDesIndex + 1, attrDes2);
  333.     if (regTabPtr.p->tupheadsize > MAX_TUPLE_SIZE_IN_WORDS) {
  334.       ljam();
  335.       terrorCode = ZTOO_LARGE_TUPLE_ERROR;
  336.       addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
  337.       return;
  338.     }//if
  339.     if (lastAttr && (fragOperPtr.p->freeNullBit != 0)) {
  340.       ljam();
  341.       terrorCode = ZINCONSISTENT_NULL_ATTRIBUTE_COUNT;
  342.       addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
  343.       return;
  344.     }//if
  345.   }//if
  346.   if (ERROR_INSERTED(4009) && regTabPtr.p->fragid[0] == fragId && attrId == 0 ||
  347.       ERROR_INSERTED(4010) && regTabPtr.p->fragid[0] == fragId && lastAttr ||
  348.       ERROR_INSERTED(4011) && regTabPtr.p->fragid[1] == fragId && attrId == 0 ||
  349.       ERROR_INSERTED(4012) && regTabPtr.p->fragid[1] == fragId && lastAttr) {
  350.     ljam();
  351.     terrorCode = 1;
  352.     addattrrefuseLab(signal, regFragPtr, fragOperPtr, regTabPtr.p, fragId);
  353.     CLEAR_ERROR_INSERT_VALUE;
  354.     return;
  355.   }
  356. /* **************************************************************** */
  357. /* **************          TUP_ADD_ATTCONF       ****************** */
  358. /* **************************************************************** */
  359.   signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
  360.   signal->theData[1] = lastAttr;
  361.   sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTCONF, signal, 2, JBB);
  362.   if (! lastAttr) {
  363.     ljam();
  364.     return; /* EXIT AND WAIT FOR MORE */
  365.   }//if
  366.   regFragPtr.p->fragStatus = ACTIVE;
  367.   if (regTabPtr.p->tableStatus == DEFINING) {
  368.     ljam();
  369.     setUpQueryRoutines(regTabPtr.p);
  370.     setUpKeyArray(regTabPtr.p);
  371.     regTabPtr.p->tableStatus = DEFINED;
  372.   }//if
  373.   releaseFragoperrec(fragOperPtr);
  374.   return;
  375. }//Dbtup::execTUP_ADD_ATTRREQ()
  376. /*
  377.  * Descriptor has these parts:
  378.  *
  379.  * 0 readFunctionArray ( one for each attribute )
  380.  * 1 updateFunctionArray ( ditto )
  381.  * 2 charsetArray ( pointers to distinct CHARSET_INFO )
  382.  * 3 readKeyArray ( attribute ids of keys )
  383.  * 4 attributeGroupDescriptor ( currently size 1 but unused )
  384.  * 5 tabDescriptor ( attribute descriptors, each ZAD_SIZE )
  385.  */
  386. void Dbtup::setUpDescriptorReferences(Uint32 descriptorReference,
  387.                                       Tablerec* const regTabPtr,
  388.                                       const Uint32* offset)
  389. {
  390.   Uint32* desc = &tableDescriptor[descriptorReference].tabDescr;
  391.   regTabPtr->readFunctionArray = (ReadFunction*)(desc + offset[0]);
  392.   regTabPtr->updateFunctionArray = (UpdateFunction*)(desc + offset[1]);
  393.   regTabPtr->charsetArray = (CHARSET_INFO**)(desc + offset[2]);
  394.   regTabPtr->readKeyArray = descriptorReference + offset[3];
  395.   regTabPtr->attributeGroupDescriptor = descriptorReference + offset[4];
  396.   regTabPtr->tabDescriptor = descriptorReference + offset[5];
  397. }//Dbtup::setUpDescriptorReferences()
  398. Uint32
  399. Dbtup::sizeOfReadFunction()
  400. {
  401.   ReadFunction* tmp = (ReadFunction*)&tableDescriptor[0];
  402.   TableDescriptor* start = &tableDescriptor[0];
  403.   TableDescriptor * end = (TableDescriptor*)(tmp + 1);
  404.   return (Uint32)(end - start);
  405. }//Dbtup::sizeOfReadFunction()
  406. void Dbtup::setUpKeyArray(Tablerec* const regTabPtr)
  407. {
  408.   ndbrequire((regTabPtr->readKeyArray + regTabPtr->noOfKeyAttr) < cnoOfTabDescrRec);
  409.   Uint32* keyArray = &tableDescriptor[regTabPtr->readKeyArray].tabDescr;
  410.   Uint32 countKeyAttr = 0;
  411.   for (Uint32 i = 0; i < regTabPtr->noOfAttr; i++) {
  412.     ljam();
  413.     Uint32 refAttr = regTabPtr->tabDescriptor + (i * ZAD_SIZE);
  414.     Uint32 attrDescriptor = getTabDescrWord(refAttr);
  415.     if (AttributeDescriptor::getPrimaryKey(attrDescriptor)) {
  416.       ljam();
  417.       AttributeHeader::init(&keyArray[countKeyAttr], i, 0);
  418.       countKeyAttr++;
  419.     }//if
  420.   }//for
  421.   ndbrequire(countKeyAttr == regTabPtr->noOfKeyAttr);
  422. }//Dbtup::setUpKeyArray()
  423. void Dbtup::addattrrefuseLab(Signal* signal,
  424.                              FragrecordPtr regFragPtr,
  425.                              FragoperrecPtr fragOperPtr,
  426.                              Tablerec* const regTabPtr,
  427.                              Uint32 fragId) 
  428. {
  429.   releaseFragPages(regFragPtr.p);
  430.   deleteFragTab(regTabPtr, fragId);
  431.   releaseFragrec(regFragPtr);
  432.   releaseTabDescr(regTabPtr);
  433.   initTab(regTabPtr);
  434.   signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
  435.   signal->theData[1] = terrorCode;
  436.   sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUP_ADD_ATTRREF, signal, 2, JBB);
  437.   releaseFragoperrec(fragOperPtr);
  438.   return;
  439. }//Dbtup::addattrrefuseLab()
  440. void Dbtup::fragrefuse4Lab(Signal* signal,
  441.                            FragoperrecPtr fragOperPtr,
  442.                            FragrecordPtr regFragPtr,
  443.                            Tablerec* const regTabPtr,
  444.                            Uint32 fragId) 
  445. {
  446.   releaseFragPages(regFragPtr.p);
  447.   fragrefuse3Lab(signal, fragOperPtr, regFragPtr, regTabPtr, fragId);
  448.   initTab(regTabPtr);
  449.   return;
  450. }//Dbtup::fragrefuse4Lab()
  451. void Dbtup::fragrefuse3Lab(Signal* signal,
  452.                            FragoperrecPtr fragOperPtr,
  453.                            FragrecordPtr regFragPtr,
  454.                            Tablerec* const regTabPtr,
  455.                            Uint32 fragId) 
  456. {
  457.   fragrefuse2Lab(signal, fragOperPtr, regFragPtr);
  458.   deleteFragTab(regTabPtr, fragId);
  459.   return;
  460. }//Dbtup::fragrefuse3Lab()
  461. void Dbtup::fragrefuse2Lab(Signal* signal, FragoperrecPtr fragOperPtr, FragrecordPtr regFragPtr) 
  462. {
  463.   fragrefuse1Lab(signal, fragOperPtr);
  464.   releaseFragrec(regFragPtr);
  465.   return;
  466. }//Dbtup::fragrefuse2Lab()
  467. void Dbtup::fragrefuse1Lab(Signal* signal, FragoperrecPtr fragOperPtr) 
  468. {
  469.   fragrefuseLab(signal, fragOperPtr);
  470.   releaseFragoperrec(fragOperPtr);
  471.   return;
  472. }//Dbtup::fragrefuse1Lab()
  473. void Dbtup::fragrefuseLab(Signal* signal, FragoperrecPtr fragOperPtr) 
  474. {
  475.   signal->theData[0] = fragOperPtr.p->lqhPtrFrag;
  476.   signal->theData[1] = terrorCode;
  477.   sendSignal(fragOperPtr.p->lqhBlockrefFrag, GSN_TUPFRAGREF, signal, 2, JBB);
  478.   return;
  479. }//Dbtup::fragrefuseLab()
  480. void Dbtup::releaseFragoperrec(FragoperrecPtr fragOperPtr) 
  481. {
  482.   fragOperPtr.p->inUse = false;
  483.   fragOperPtr.p->nextFragoprec = cfirstfreeFragopr;
  484.   cfirstfreeFragopr = fragOperPtr.i;
  485. }//Dbtup::releaseFragoperrec()
  486. void Dbtup::deleteFragTab(Tablerec* const regTabPtr, Uint32 fragId) 
  487. {
  488.   for (Uint32 i = 0; i < (2 * MAX_FRAG_PER_NODE); i++) {
  489.     ljam();
  490.     if (regTabPtr->fragid[i] == fragId) {
  491.       ljam();
  492.       regTabPtr->fragid[i] = RNIL;
  493.       regTabPtr->fragrec[i] = RNIL;
  494.       return;
  495.     }//if
  496.   }//for
  497.   ndbrequire(false);
  498. }//Dbtup::deleteFragTab()
  499. /*
  500.  * LQH aborts on-going create table operation.  The table is later
  501.  * dropped by DICT.
  502.  */
  503. void Dbtup::abortAddFragOp(Signal* signal)
  504. {
  505.   FragoperrecPtr fragOperPtr;
  506.   fragOperPtr.i = signal->theData[1];
  507.   ptrCheckGuard(fragOperPtr, cnoOfFragoprec, fragoperrec);
  508.   ndbrequire(fragOperPtr.p->inUse);
  509.   releaseFragoperrec(fragOperPtr);
  510. }
  511. void
  512. Dbtup::execDROP_TAB_REQ(Signal* signal)
  513. {
  514.   ljamEntry();
  515.   DropTabReq* req = (DropTabReq*)signal->getDataPtr();
  516.   
  517.   TablerecPtr tabPtr;
  518.   tabPtr.i = req->tableId;
  519.   ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
  520.   
  521.   tabPtr.p->m_dropTable.tabUserRef = req->senderRef;
  522.   tabPtr.p->m_dropTable.tabUserPtr = req->senderData;
  523.   signal->theData[0] = ZREL_FRAG;
  524.   signal->theData[1] = tabPtr.i;
  525.   sendSignal(cownref, GSN_CONTINUEB, signal, 2, JBB);
  526. }//Dbtup::execDROP_TAB_REQ()
  527. void Dbtup::releaseTabDescr(Tablerec* const regTabPtr) 
  528. {
  529.   Uint32 descriptor = regTabPtr->readKeyArray;
  530.   if (descriptor != RNIL) {
  531.     ljam();
  532.     Uint32 offset[10];
  533.     getTabDescrOffsets(regTabPtr, offset);
  534.     regTabPtr->tabDescriptor = RNIL;
  535.     regTabPtr->readKeyArray = RNIL;
  536.     regTabPtr->readFunctionArray = NULL;
  537.     regTabPtr->updateFunctionArray = NULL;
  538.     regTabPtr->charsetArray = NULL;
  539.     regTabPtr->attributeGroupDescriptor= RNIL;
  540.     // move to start of descriptor
  541.     descriptor -= offset[3];
  542.     Uint32 retNo = getTabDescrWord(descriptor + ZTD_DATASIZE);
  543.     ndbrequire(getTabDescrWord(descriptor + ZTD_HEADER) == ZTD_TYPE_NORMAL);
  544.     ndbrequire(retNo == getTabDescrWord((descriptor + retNo) - ZTD_TR_SIZE));
  545.     ndbrequire(ZTD_TYPE_NORMAL == getTabDescrWord((descriptor + retNo) - ZTD_TR_TYPE));
  546.     freeTabDescr(descriptor, retNo);
  547.   }//if
  548. }//Dbtup::releaseTabDescr()
  549. void Dbtup::releaseFragment(Signal* signal, Uint32 tableId)
  550. {
  551.   TablerecPtr tabPtr;
  552.   tabPtr.i = tableId;
  553.   ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
  554.   Uint32 fragIndex = RNIL;
  555.   Uint32 fragId = RNIL;
  556.   Uint32 i = 0;
  557.   for (i = 0; i < (2 * MAX_FRAG_PER_NODE); i++) {
  558.     ljam();
  559.     if (tabPtr.p->fragid[i] != RNIL) {
  560.       ljam();
  561.       fragIndex = tabPtr.p->fragrec[i];
  562.       fragId = tabPtr.p->fragid[i];
  563.       break;
  564.     }//if
  565.   }//for
  566.   if (fragIndex != RNIL) {
  567.     ljam();
  568.     
  569.     FragrecordPtr regFragPtr;
  570.     regFragPtr.i = fragIndex;
  571.     ptrCheckGuard(regFragPtr, cnoOfFragrec, fragrecord);
  572.     releaseFragPages(regFragPtr.p);
  573.     tabPtr.p->fragid[i] = RNIL;
  574.     tabPtr.p->fragrec[i] = RNIL;
  575.     releaseFragrec(regFragPtr);
  576.     signal->theData[0] = ZREL_FRAG;
  577.     signal->theData[1] = tableId;
  578.     sendSignal(cownref, GSN_CONTINUEB, signal, 2, JBB);  
  579.     return;
  580.   }//if
  581.   
  582.   /**
  583.    * Finished...
  584.    */
  585.   sendFSREMOVEREQ(signal, tabPtr);
  586. }//Dbtup::releaseFragment()
  587. void Dbtup::sendFSREMOVEREQ(Signal* signal, TablerecPtr tabPtr)
  588. {
  589.   FsRemoveReq * const fsReq = (FsRemoveReq *)signal->getDataPtrSend();
  590.   fsReq->userReference = cownref;
  591.   fsReq->userPointer = tabPtr.i;
  592.   fsReq->fileNumber[0] = tabPtr.i;
  593.   fsReq->fileNumber[1] = (Uint32)-1; // Remove all fragments
  594.   fsReq->fileNumber[2] = (Uint32)-1; // Remove all data files within fragment
  595.   fsReq->fileNumber[3] = 255 |       // No P-value used here
  596.     (5 <<  8) |  // Data-files in D5
  597.     (0 << 16) | // Data-files
  598.     (1 << 24);  // Version 1 of fileNumber
  599.   
  600.   fsReq->directory = 1;
  601.   fsReq->ownDirectory = 1;
  602.   sendSignal(NDBFS_REF, GSN_FSREMOVEREQ, signal, 
  603.      FsRemoveReq::SignalLength, JBA);  
  604. }//Dbtup::sendFSREMOVEREQ()
  605.  
  606. void Dbtup::execFSREMOVECONF(Signal* signal)
  607. {
  608.   ljamEntry();
  609.   
  610.   FsConf * const fsConf = (FsConf *)signal->getDataPtrSend();
  611.   TablerecPtr tabPtr;
  612.   tabPtr.i = fsConf->userPointer;
  613.   ptrCheckGuard(tabPtr, cnoOfTablerec, tablerec);
  614.   
  615.   DropTabConf * const dropConf = (DropTabConf *)signal->getDataPtrSend();
  616.   dropConf->senderRef = reference();
  617.   dropConf->senderData = tabPtr.p->m_dropTable.tabUserPtr;
  618.   dropConf->tableId = tabPtr.i;
  619.   sendSignal(tabPtr.p->m_dropTable.tabUserRef, GSN_DROP_TAB_CONF,
  620.              signal, DropTabConf::SignalLength, JBB);
  621.   
  622.   releaseTabDescr(tabPtr.p);
  623.   initTab(tabPtr.p);
  624. }//Dbtup::execFSREMOVECONF()