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

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. #define ljam() { jamLine(18000 + __LINE__); }
  19. #define ljamEntry() { jamEntryLine(18000 + __LINE__); }
  20. /* ---------------------------------------------------------------- */
  21. /* ---------------------------------------------------------------- */
  22. /* ------------ADD/DROP STORED PROCEDURE MODULE ------------------- */
  23. /* ---------------------------------------------------------------- */
  24. /* ---------------------------------------------------------------- */
  25. void Dbtup::execSTORED_PROCREQ(Signal* signal) 
  26. {
  27.   OperationrecPtr regOperPtr;
  28.   TablerecPtr regTabPtr;
  29.   ljamEntry();
  30.   regOperPtr.i = signal->theData[0];
  31.   ptrCheckGuard(regOperPtr, cnoOfOprec, operationrec);
  32.   regTabPtr.i = signal->theData[1];
  33.   ptrCheckGuard(regTabPtr, cnoOfTablerec, tablerec);
  34.   Uint32 requestInfo = signal->theData[3];
  35.   ndbrequire(regOperPtr.p->transstate == IDLE ||
  36.              ((regOperPtr.p->transstate == ERROR_WAIT_STORED_PROCREQ) &&
  37.              (requestInfo == ZSTORED_PROCEDURE_DELETE)));
  38.   ndbrequire(regTabPtr.p->tableStatus == DEFINED);
  39.   switch (requestInfo) {
  40.   case ZSCAN_PROCEDURE:
  41.     ljam();
  42.     scanProcedure(signal,
  43.                   regOperPtr.p,
  44.                   signal->theData[4]);
  45.     break;
  46.   case ZCOPY_PROCEDURE:
  47.     ljam();
  48.     copyProcedure(signal, regTabPtr, regOperPtr.p);
  49.     break;
  50.   case ZSTORED_PROCEDURE_DELETE:
  51.     ljam();
  52.     deleteScanProcedure(signal, regOperPtr.p);
  53.     break;
  54.   default:
  55.     ndbrequire(false);
  56.   }//switch
  57. }//Dbtup::execSTORED_PROCREQ()
  58. void Dbtup::deleteScanProcedure(Signal* signal,
  59.                                 Operationrec* regOperPtr) 
  60. {
  61.   StoredProcPtr storedPtr;
  62.   Uint32 storedProcId = signal->theData[4];
  63.   c_storedProcPool.getPtr(storedPtr, storedProcId);
  64.   ndbrequire(storedPtr.p->storedCode == ZSCAN_PROCEDURE);
  65.   ndbrequire(storedPtr.p->storedCounter == 0);
  66.   Uint32 firstAttrinbuf = storedPtr.p->storedLinkFirst;
  67.   storedPtr.p->storedCode = ZSTORED_PROCEDURE_FREE;
  68.   storedPtr.p->storedLinkFirst = RNIL;
  69.   storedPtr.p->storedLinkLast = RNIL;
  70.   storedPtr.p->storedProcLength = 0;
  71.   c_storedProcPool.release(storedPtr);
  72.   freeAttrinbufrec(firstAttrinbuf);
  73.   regOperPtr->currentAttrinbufLen = 0;
  74.   regOperPtr->transstate = IDLE;
  75.   signal->theData[0] = regOperPtr->userpointer;
  76.   signal->theData[1] = storedProcId;
  77.   sendSignal(regOperPtr->userblockref, GSN_STORED_PROCCONF, signal, 2, JBB);
  78. }//Dbtup::deleteScanProcedure()
  79. void Dbtup::scanProcedure(Signal* signal,
  80.                           Operationrec* regOperPtr,
  81.                           Uint32 lenAttrInfo)
  82. {
  83. //--------------------------------------------------------
  84. // We introduce the maxCheck so that there is always one
  85. // stored procedure entry free for copy procedures. Thus
  86. // no amount of scanning can cause problems for the node
  87. // recovery functionality.
  88. //--------------------------------------------------------
  89.   StoredProcPtr storedPtr;
  90.   c_storedProcPool.seize(storedPtr);
  91.   ndbrequire(storedPtr.i != RNIL);
  92.   storedPtr.p->storedCode = ZSCAN_PROCEDURE;
  93.   storedPtr.p->storedCounter = 0;
  94.   storedPtr.p->storedProcLength = lenAttrInfo;
  95.   storedPtr.p->storedLinkFirst = RNIL;
  96.   storedPtr.p->storedLinkLast = RNIL;
  97.   regOperPtr->transstate = WAIT_STORED_PROCEDURE_ATTR_INFO;
  98.   regOperPtr->attrinbufLen = lenAttrInfo;
  99.   regOperPtr->currentAttrinbufLen = 0;
  100.   regOperPtr->pageOffset = storedPtr.i;
  101. }//Dbtup::scanProcedure()
  102. void Dbtup::copyProcedure(Signal* signal,
  103.                           TablerecPtr regTabPtr,
  104.                           Operationrec* regOperPtr) 
  105. {
  106.   Uint32 TnoOfAttributes = regTabPtr.p->noOfAttr;
  107.   scanProcedure(signal,
  108.                 regOperPtr,
  109.                 TnoOfAttributes);
  110.   Uint32 length = 0;
  111.   for (Uint32 Ti = 0; Ti < TnoOfAttributes; Ti++) {
  112.     AttributeHeader::init(&signal->theData[length + 1], Ti, 0);
  113.     length++;
  114.     if (length == 24) {
  115.       ljam();
  116.       ndbrequire(storedProcedureAttrInfo(signal, regOperPtr, length, 1, true));
  117.       length = 0;
  118.     }//if
  119.   }//for
  120.   if (length != 0) {
  121.     ljam();
  122.     ndbrequire(storedProcedureAttrInfo(signal, regOperPtr, length, 1, true));
  123.   }//if
  124.   ndbrequire(regOperPtr->currentAttrinbufLen == 0);
  125. }//Dbtup::copyProcedure()
  126. bool Dbtup::storedProcedureAttrInfo(Signal* signal,
  127.                                     Operationrec* regOperPtr,
  128.                                     Uint32 length,
  129.                                     Uint32 firstWord,
  130.                                     bool copyProcedure) 
  131. {
  132.   AttrbufrecPtr regAttrPtr;
  133.   Uint32 RnoFree = cnoFreeAttrbufrec;
  134.   if (ERROR_INSERTED(4004) && !copyProcedure) {
  135.     CLEAR_ERROR_INSERT_VALUE;
  136.     storedSeizeAttrinbufrecErrorLab(signal, regOperPtr);
  137.     return false;
  138.   }//if
  139.   regOperPtr->currentAttrinbufLen += length;
  140.   ndbrequire(regOperPtr->currentAttrinbufLen <= regOperPtr->attrinbufLen);
  141.   if ((RnoFree > MIN_ATTRBUF) ||
  142.       (copyProcedure)) {
  143.     ljam();
  144.     regAttrPtr.i = cfirstfreeAttrbufrec;
  145.     ptrCheckGuard(regAttrPtr, cnoOfAttrbufrec, attrbufrec);
  146.     regAttrPtr.p->attrbuf[ZBUF_DATA_LEN] = 0;
  147.     cfirstfreeAttrbufrec = regAttrPtr.p->attrbuf[ZBUF_NEXT];
  148.     cnoFreeAttrbufrec = RnoFree - 1;
  149.     regAttrPtr.p->attrbuf[ZBUF_NEXT] = RNIL;
  150.   } else {
  151.     ljam();
  152.     storedSeizeAttrinbufrecErrorLab(signal, regOperPtr);
  153.     return false;
  154.   }//if
  155.   if (regOperPtr->firstAttrinbufrec == RNIL) {
  156.     ljam();
  157.     regOperPtr->firstAttrinbufrec = regAttrPtr.i;
  158.   }//if
  159.   regAttrPtr.p->attrbuf[ZBUF_NEXT] = RNIL;
  160.   if (regOperPtr->lastAttrinbufrec != RNIL) {
  161.     AttrbufrecPtr tempAttrinbufptr;
  162.     ljam();
  163.     tempAttrinbufptr.i = regOperPtr->lastAttrinbufrec;  
  164.     ptrCheckGuard(tempAttrinbufptr, cnoOfAttrbufrec, attrbufrec);
  165.     tempAttrinbufptr.p->attrbuf[ZBUF_NEXT] = regAttrPtr.i;
  166.   }//if
  167.   regOperPtr->lastAttrinbufrec = regAttrPtr.i;
  168.   regAttrPtr.p->attrbuf[ZBUF_DATA_LEN] = length;
  169.   MEMCOPY_NO_WORDS(&regAttrPtr.p->attrbuf[0],
  170.                    &signal->theData[firstWord],
  171.                    length);
  172.   if (regOperPtr->currentAttrinbufLen < regOperPtr->attrinbufLen) {
  173.     ljam();
  174.     return true;
  175.   }//if
  176.   if (ERROR_INSERTED(4005) && !copyProcedure) {
  177.     CLEAR_ERROR_INSERT_VALUE;
  178.     storedSeizeAttrinbufrecErrorLab(signal, regOperPtr);
  179.     return false;
  180.   }//if
  181.   StoredProcPtr storedPtr;
  182.   c_storedProcPool.getPtr(storedPtr, (Uint32)regOperPtr->pageOffset);
  183.   ndbrequire(storedPtr.p->storedCode == ZSCAN_PROCEDURE);
  184.   regOperPtr->currentAttrinbufLen = 0;
  185.   storedPtr.p->storedLinkFirst = regOperPtr->firstAttrinbufrec;
  186.   storedPtr.p->storedLinkLast = regOperPtr->lastAttrinbufrec;
  187.   regOperPtr->firstAttrinbufrec = RNIL;
  188.   regOperPtr->lastAttrinbufrec = RNIL;
  189.   regOperPtr->transstate = IDLE;
  190.   signal->theData[0] = regOperPtr->userpointer;
  191.   signal->theData[1] = storedPtr.i;
  192.   sendSignal(regOperPtr->userblockref, GSN_STORED_PROCCONF, signal, 2, JBB);
  193.   return true;
  194. }//Dbtup::storedProcedureAttrInfo()
  195. void Dbtup::storedSeizeAttrinbufrecErrorLab(Signal* signal,
  196.                                             Operationrec* regOperPtr)
  197. {
  198.   StoredProcPtr storedPtr;
  199.   c_storedProcPool.getPtr(storedPtr, (Uint32)regOperPtr->pageOffset);
  200.   ndbrequire(storedPtr.p->storedCode == ZSCAN_PROCEDURE);
  201.   storedPtr.p->storedLinkFirst = regOperPtr->firstAttrinbufrec;
  202.   regOperPtr->firstAttrinbufrec = RNIL;
  203.   regOperPtr->lastAttrinbufrec = RNIL;
  204.   regOperPtr->transstate = ERROR_WAIT_STORED_PROCREQ;
  205.   signal->theData[0] = regOperPtr->userpointer;
  206.   signal->theData[1] = ZSTORED_SEIZE_ATTRINBUFREC_ERROR;
  207.   signal->theData[2] = regOperPtr->pageOffset;
  208.   sendSignal(regOperPtr->userblockref, GSN_STORED_PROCREF, signal, 3, JBB);
  209. }//Dbtup::storedSeizeAttrinbufrecErrorLab()