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

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. #include <ndb_global.h>
  14. #include <NdbOperation.hpp>
  15. #include "NdbApiSignal.hpp"
  16. #include <NdbConnection.hpp>
  17. #include <Ndb.hpp>
  18. #include "NdbRecAttr.hpp"
  19. #include "NdbUtil.hpp"
  20. #include "Interpreter.hpp"
  21. #include <NdbIndexScanOperation.hpp>
  22. #ifdef VM_TRACE
  23. #include <NdbEnv.h>
  24. #define INT_DEBUG(x) 
  25.   { const char* tmp = NdbEnv_GetEnv("INT_DEBUG", (char*)0, 0); 
  26.   if (tmp != 0 && strlen(tmp) != 0) { ndbout << "INT:"; ndbout_c x; } }
  27. #else
  28. #define INT_DEBUG(x)
  29. #endif
  30. void
  31. NdbOperation::initInterpreter(){
  32.   theFirstLabel = NULL;
  33.   theLastLabel = NULL;
  34.   theFirstBranch = NULL;
  35.   theLastBranch = NULL;
  36.   
  37.   theFirstCall = NULL;
  38.   theLastCall = NULL;
  39.   theFirstSubroutine = NULL;
  40.   theLastSubroutine = NULL;
  41.   
  42.   theNoOfLabels = 0;
  43.   theNoOfSubroutines = 0;
  44.   
  45.   theSubroutineSize = 0;
  46.   theInitialReadSize = 0;
  47.   theInterpretedSize = 0;
  48.   theFinalUpdateSize = 0;
  49.   theFinalReadSize = 0;
  50.   theInterpretIndicator = 1;
  51.   theTotalCurrAI_Len = 5;
  52. }
  53. int
  54. NdbOperation::incCheck(const NdbColumnImpl* tNdbColumnImpl)
  55. {
  56.   if ((theInterpretIndicator == 1)) {
  57.     if ((tNdbColumnImpl == NULL) ||
  58.         (theOperationType == OpenScanRequest ||
  59.          theOperationType == OpenRangeScanRequest))
  60.       goto inc_check_error1;
  61.     if ((tNdbColumnImpl->getInterpretableType() != true) ||
  62.         (tNdbColumnImpl->m_pk != false) ||
  63.         (tNdbColumnImpl->m_nullable))
  64.       goto inc_check_error2;
  65.     if (theStatus == ExecInterpretedValue) {
  66.       ; // Simply continue with interpretation
  67.     } else if (theStatus == GetValue) {
  68.       theInitialReadSize = theTotalCurrAI_Len - 5;
  69.       theStatus = ExecInterpretedValue;
  70.     } else if (theStatus == SubroutineExec) {
  71.       ; // Simply continue with interpretation
  72.     } else {
  73.       setErrorCodeAbort(4231);
  74.       return -1;
  75.     }
  76.     return tNdbColumnImpl->m_attrId;
  77.   } else {
  78.     if (theNdbCon->theCommitStatus == NdbConnection::Started)
  79.       setErrorCodeAbort(4200);
  80.   }
  81.   return -1;
  82.   
  83.  inc_check_error1:
  84.   if (theOperationType == OpenScanRequest ||
  85.       theOperationType == OpenRangeScanRequest) {
  86.     setErrorCodeAbort(4228);
  87.     return -1;
  88.   }
  89.   setErrorCodeAbort(4004);
  90.   return -1;
  91.   
  92.  inc_check_error2:
  93.   if (tNdbColumnImpl->m_pk){
  94.     setErrorCodeAbort(4202);
  95.     return -1;
  96.   }//if
  97.   if (!tNdbColumnImpl->getInterpretableType()){
  98.     setErrorCodeAbort(4217);
  99.     return -1;
  100.   }//if
  101.   if (tNdbColumnImpl->m_nullable){
  102.     setErrorCodeAbort(4218);
  103.     return -1;
  104.   }//if
  105.   setErrorCodeAbort(4219);
  106.   return -1;
  107. }
  108. int
  109. NdbOperation::write_attrCheck(const NdbColumnImpl* tNdbColumnImpl)
  110. {
  111.   if ((theInterpretIndicator == 1)) {
  112.     if ((tNdbColumnImpl == NULL) ||
  113.         (theOperationType == OpenScanRequest ||
  114.          theOperationType == OpenRangeScanRequest))
  115.       goto write_attr_check_error1;
  116.     if ((tNdbColumnImpl->getInterpretableType() == false) ||
  117.         (tNdbColumnImpl->m_pk))
  118.       goto write_attr_check_error2;
  119.     if (theStatus == ExecInterpretedValue) {
  120.       ; // Simply continue with interpretation
  121.     } else if (theStatus == SubroutineExec) {
  122.       ; // Simply continue with interpretation
  123.     } else {
  124.       setErrorCodeAbort(4231);
  125.       return -1;
  126.     }
  127.     return tNdbColumnImpl->m_attrId;
  128.   } else {
  129.     if (theNdbCon->theCommitStatus == NdbConnection::Started)
  130.       setErrorCodeAbort(4200);
  131.   }
  132.   return -1;
  133. write_attr_check_error1:
  134.   if (theOperationType == OpenScanRequest ||
  135.       theOperationType == OpenRangeScanRequest) {
  136.     setErrorCodeAbort(4228);
  137.     return -1;
  138.   }
  139.   setErrorCodeAbort(4004);
  140.   return -1;
  141. write_attr_check_error2:
  142.   if (tNdbColumnImpl->m_pk) {
  143.     setErrorCodeAbort(4202);
  144.     return -1;
  145.   }//if
  146.   if (tNdbColumnImpl->getInterpretableType() == false){
  147.     setErrorCodeAbort(4217);
  148.     return -1;
  149.   }//if
  150.   setErrorCodeAbort(4219);
  151.   return -1;
  152. }
  153. int
  154. NdbOperation::read_attrCheck(const NdbColumnImpl* tNdbColumnImpl)
  155. {
  156.   if ((theInterpretIndicator == 1)) {
  157.     if (tNdbColumnImpl == NULL)
  158.       goto read_attr_check_error1;
  159.     if (tNdbColumnImpl->getInterpretableType() == false)
  160.       goto read_attr_check_error2;
  161.     if (theStatus == ExecInterpretedValue) {
  162.       ; // Simply continue with interpretation
  163.     } else if (theStatus == GetValue) {
  164.       theInitialReadSize = theTotalCurrAI_Len - 5;
  165.       theStatus = ExecInterpretedValue;
  166.     } else if (theStatus == SubroutineExec) {
  167.       ; // Simply continue with interpretation
  168.     } else {
  169.       setErrorCodeAbort(4231);
  170.       return -1;
  171.     }
  172.     return tNdbColumnImpl->m_attrId;
  173.   } else {
  174.     if (theNdbCon->theCommitStatus == NdbConnection::Started)
  175.       setErrorCodeAbort(4200);
  176.   }
  177.   return -1;
  178.   
  179.  read_attr_check_error1:
  180.   setErrorCodeAbort(4004);
  181.   return -1;
  182.   
  183.  read_attr_check_error2:
  184.   if (tNdbColumnImpl->getInterpretableType() == false)
  185.     setErrorCodeAbort(4217);
  186.   else
  187.     setErrorCodeAbort(4219);
  188.   return -1;
  189. }
  190. int
  191. NdbOperation::initial_interpreterCheck()
  192. {
  193.   if ((theInterpretIndicator == 1)) {
  194.     if (theStatus == ExecInterpretedValue) {
  195.        return 0; // Simply continue with interpretation
  196.     } else if (theStatus == GetValue) {
  197.       theInitialReadSize = theTotalCurrAI_Len - 5;
  198.       theStatus = ExecInterpretedValue;
  199.       return 0;
  200.     } else if (theStatus == SubroutineExec) {
  201.        return 0; // Simply continue with interpretation
  202.     } else {
  203.       setErrorCodeAbort(4231);
  204.       return -1;
  205.     }
  206.     return 0;
  207.   } else {
  208.     if (theNdbCon->theCommitStatus == NdbConnection::Started)
  209.       setErrorCodeAbort(4200);
  210.   }
  211.   return -1;
  212. }
  213. int
  214. NdbOperation::labelCheck()
  215. {
  216.   if ((theInterpretIndicator == 1)) {
  217.     if (theStatus == ExecInterpretedValue) {
  218.        return 0; // Simply continue with interpretation
  219.     } else if (theStatus == GetValue) {
  220.       theInitialReadSize = theTotalCurrAI_Len - 5;
  221.       theStatus = ExecInterpretedValue;
  222.       return 0;
  223.     } else if (theStatus == SubroutineExec) {
  224.        return 0; // Simply continue with interpretation
  225.     } else if (theStatus == SubroutineEnd) {
  226.        theStatus = SubroutineExec;
  227.     } else {
  228.       setErrorCodeAbort(4231);
  229.       return -1;
  230.     }
  231.     return 0;
  232.   } else {
  233.     if (theNdbCon->theCommitStatus == NdbConnection::Started)
  234.       setErrorCodeAbort(4200);
  235.   }
  236.   return -1;
  237. }
  238. int
  239. NdbOperation::intermediate_interpreterCheck()
  240. {
  241.   if ((theInterpretIndicator == 1)) {
  242.     if (theStatus == ExecInterpretedValue) {
  243.        return 0; // Simply continue with interpretation
  244.     } else if (theStatus == SubroutineExec) {
  245.        return 0; // Simply continue with interpretation
  246.     } else {
  247.       setErrorCodeAbort(4231);
  248.       return -1;
  249.     }
  250.     return 0;
  251.   } else {
  252.     if (theNdbCon->theCommitStatus == NdbConnection::Started)
  253.       setErrorCodeAbort(4200);
  254.   }
  255.   return -1;
  256. }
  257. /*****************************************************************************
  258.  * int incValue(const char* anAttrName, char* aValue, Uint32 aValue)
  259.  *
  260.  * Return Value:  Return 0 : incValue was succesful.
  261.  *                Return -1: In all other case.   
  262.  * Parameters:    anAttrName : Attribute name where the attribute value 
  263.  *                             will be save.
  264.  *                aValue : The constant to increment the attribute value with. 
  265.  *****************************************************************************/
  266. int
  267. NdbOperation::incValue(const NdbColumnImpl* tNdbColumnImpl, Uint32 aValue)
  268. {
  269.   INT_DEBUG(("incValue32 %d %u", tNdbColumnImpl->m_attrId, aValue));
  270.   int tAttrId;
  271.   tAttrId = incCheck(tNdbColumnImpl);
  272.   if (tAttrId == -1)
  273.     goto incValue_error1;
  274. // Load Attribute into register 6
  275.   if (insertATTRINFO( Interpreter::Read(tAttrId, 6)) == -1)
  276.     goto incValue_error1;
  277. // Load aValue into register 7
  278.   if (aValue < 65536)
  279.   {
  280.     if (insertATTRINFO(Interpreter::LoadConst16(7, aValue)) == -1)
  281.       goto incValue_error1;
  282.   } else {
  283.     if (insertATTRINFO(Interpreter::LoadConst32(7)) == -1)
  284.       goto incValue_error1;
  285.     if (insertATTRINFO(aValue) == -1)
  286.       goto incValue_error1;
  287.   }
  288.   // Add register 6 and 7 and put result in register 7
  289.   if (insertATTRINFO( Interpreter::Add(7, 6, 7)) == -1)
  290.     goto incValue_error1;
  291.   if (insertATTRINFO( Interpreter::Write(tAttrId, 7)) == -1)
  292.     goto incValue_error1;
  293.   
  294.   theErrorLine++;
  295.   return 0;
  296. incValue_error1:
  297.   return -1;
  298. }
  299. /*****************************************************************************
  300.  * int subValue(const char* anAttrName, char* aValue, Uint32 aValue)
  301.  *
  302.  * Return Value:   Return 0 : incValue was succesful.
  303.  *                 Return -1: In all other case.   
  304.  * Parameters:     anAttrName : Attribute name where the attribute value 
  305.  *                              will be save.
  306.  *                aValue : The constant to increment the attribute value with. 
  307. ******************************************************************************/
  308. int
  309. NdbOperation::subValue(const NdbColumnImpl* tNdbColumnImpl, Uint32 aValue)
  310. {
  311.   INT_DEBUG(("subValue32 %d %u", tNdbColumnImpl->m_attrId, aValue));
  312.   int tAttrId;
  313.   tAttrId = incCheck(tNdbColumnImpl);
  314.   if (tAttrId == -1)
  315.     goto subValue_error1;
  316. // Load Attribute into register 6
  317.   if (insertATTRINFO( Interpreter::Read(tAttrId, 6)) == -1)
  318.     goto subValue_error1;
  319. // Load aValue into register 7
  320.   if (aValue < 65536)
  321.   {
  322.     if (insertATTRINFO( Interpreter::LoadConst16(7, aValue)) == -1)
  323.       goto subValue_error1;
  324.   } else {
  325.     if (insertATTRINFO( Interpreter::LoadConst32(7)) == -1)
  326.       goto subValue_error1;
  327.     if (insertATTRINFO(aValue) == -1)
  328.       goto subValue_error1;
  329.   }
  330.   // Subtract register 6 and 7 and put result in register 7
  331.   
  332.   if (insertATTRINFO( Interpreter::Sub(7, 6, 7)) == -1)
  333.     goto subValue_error1;
  334.   if (insertATTRINFO( Interpreter::Write(tAttrId, 7)) == -1)
  335.     goto subValue_error1;
  336.   
  337.   theErrorLine++;
  338.   return 0;
  339.   
  340.  subValue_error1:
  341.   return -1;
  342. }
  343. /******************************************************************************
  344.  * int incValue(const char* anAttrName, char* aValue, Uint64 aValue)
  345.  *
  346.  * Return Value:   Return 0 : incValue was succesful.
  347.  *                 Return -1: In all other case.   
  348.  * Parameters:     anAttrName : Attribute name where the attribute value will 
  349.  *                             be save.
  350.  *                aValue : The constant to increment the attribute value with. 
  351.  *****************************************************************************/
  352. int
  353. NdbOperation::incValue(const NdbColumnImpl* tNdbColumnImpl, Uint64 aValue)
  354. {
  355.   INT_DEBUG(("incValue64 %d %llu", tNdbColumnImpl->m_attrId, aValue));
  356.   int tAttrId;
  357.   tAttrId = incCheck(tNdbColumnImpl);
  358.   if (tAttrId == -1)
  359.     goto incValue_error1;
  360. // Load Attribute into register 6
  361.   if (insertATTRINFO( Interpreter::Read(tAttrId, 6)) == -1)
  362.     goto incValue_error1;
  363. // Load aValue into register 7
  364.   if (insertATTRINFO( Interpreter::LoadConst64(7)) == -1)
  365.     goto incValue_error1;
  366.   if (insertATTRINFOloop((Uint32*)&aValue, 2) == -1)
  367.     goto incValue_error1;
  368.   // Add register 6 and 7 and put result in register 7
  369.   if (insertATTRINFO( Interpreter::Add(7, 6, 7)) == -1)
  370.     goto incValue_error1;
  371.   if (insertATTRINFO( Interpreter::Write(tAttrId, 7)) == -1)
  372.     goto incValue_error1;
  373.   
  374.   theErrorLine++;
  375.   return 0;  
  376. incValue_error1:
  377.   return -1;
  378. }
  379. /*****************************************************************************
  380.  * int subValue(const char* anAttrName, char* aValue, Uint64 aValue)
  381.  *
  382.  * Return Value:   Return 0 : incValue was succesful.
  383.  *                Return -1: In all other case.   
  384.  * Parameters:     anAttrName : Attribute name where the attribute value will 
  385.  *                              be save.
  386.  *                aValue : The constant to increment the attribute value with. 
  387. ******************************************************************************/
  388. int
  389. NdbOperation::subValue(const NdbColumnImpl* tNdbColumnImpl, Uint64 aValue)
  390. {
  391.   INT_DEBUG(("subValue64 %d %llu", tNdbColumnImpl->m_attrId, aValue));
  392.   int tAttrId;
  393.   tAttrId = incCheck(tNdbColumnImpl);
  394.   if (tAttrId == -1)
  395.     goto subValue_error1;
  396. // Load Attribute into register 6
  397.   if (insertATTRINFO( Interpreter::Read(6, tAttrId)) == -1)
  398.     goto subValue_error1;
  399. // Load aValue into register 7
  400.   if (insertATTRINFO( Interpreter::LoadConst64(7)) == -1)
  401.     goto subValue_error1;
  402.   if (insertATTRINFOloop((Uint32*)&aValue, 2) == -1)
  403.     goto subValue_error1;
  404. // Subtract register 6 and 7 and put result in register 7
  405.   if (insertATTRINFO( Interpreter::Sub(7, 6, 7)) == -1)
  406.     goto subValue_error1;
  407.   if (insertATTRINFO( Interpreter::Write(tAttrId, 7)) == -1)
  408.     goto subValue_error1;
  409.   theErrorLine++;
  410.   return 0;  
  411. subValue_error1:
  412.   return -1;
  413. }
  414. /*****************************************************************************
  415.  * int NdbOperation::def_label()
  416.  *****************************************************************************/
  417. int
  418. NdbOperation::def_label(int tLabelNo)
  419. {
  420.   INT_DEBUG(("def_label %d", tLabelNo));
  421.   Uint32 tLabelIndex;
  422.   if (labelCheck() == -1)
  423.     return -1;
  424.   tLabelIndex = theNoOfLabels - ((theNoOfLabels >> 4) << 4);
  425.   if (tLabelIndex == 0)
  426.   {
  427.     NdbLabel* tNdbLabel = theNdb->getNdbLabel();
  428.     if (tNdbLabel == NULL)
  429.     {
  430.       setErrorCodeAbort(4000);
  431.       return -1;
  432.     }
  433.     if (theFirstLabel == NULL)
  434.       theFirstLabel = tNdbLabel;
  435.     else
  436.       theLastLabel->theNext = tNdbLabel;
  437.     theLastLabel = tNdbLabel;
  438.     tNdbLabel->theNext = NULL;
  439.   }
  440.   /**
  441.    * Here we set the address that the label should point to (jump address), 
  442.    * the first 5 words are excluded since they are length specifications and 
  443.    * not part of the data. 
  444.    * We need to add 1 to the current ATTRINFO length since the last inserted 
  445.    * item is not where we want to jump to. 
  446.    * Later on we will update the branch items with this address, this is done in
  447.    * the NdbOperation::prepareSendInterpreted method.
  448.    */
  449.   theLastLabel->theLabelNo[tLabelIndex] = tLabelNo;
  450.   theLastLabel->theLabelAddress[tLabelIndex] = (theTotalCurrAI_Len + 1) - (theInitialReadSize + 5);
  451.   theLastLabel->theSubroutine[tLabelIndex] = theNoOfSubroutines;
  452.   theNoOfLabels++;
  453.   theErrorLine++;
  454.   return (theNoOfLabels - 1);
  455. }
  456. /************************************************************************************************
  457. int NdbOperation::def_subroutine()
  458. ************************************************************************************************/
  459. int
  460. NdbOperation::def_subroutine(int tSubNo)
  461. {
  462.   INT_DEBUG(("def_subroutine %d", tSubNo));
  463.   Uint32 tSubroutineIndex;
  464.   if (theInterpretIndicator != 1)
  465.   {
  466.     setErrorCodeAbort(4200);
  467.     return -1;
  468.   }
  469.   if (int(theNoOfSubroutines) != tSubNo)
  470.   {
  471.     setErrorCodeAbort(4227);
  472.     return -1;
  473.   }
  474.   if (theStatus == FinalGetValue)
  475.   {
  476.     theFinalReadSize = theTotalCurrAI_Len -
  477.        (theInitialReadSize + theInterpretedSize + 
  478.         theFinalUpdateSize + 5);
  479.   } else if (theStatus == SubroutineEnd)
  480.   {
  481.      ; // Correct Status, last call was ret_sub()
  482.   } else if (theStatus == ExecInterpretedValue)
  483.   {
  484.     if (insertATTRINFO(Interpreter::EXIT_OK) == -1)
  485.       return -1;
  486.     theInterpretedSize = theTotalCurrAI_Len - (theInitialReadSize + 5);
  487.   } else if (theStatus == SetValueInterpreted)
  488.   {
  489.     theFinalUpdateSize = theTotalCurrAI_Len -
  490.        (theInitialReadSize + theInterpretedSize + 5);
  491.   } else if (theStatus == GetValue)
  492.   {
  493.     theInitialReadSize = theTotalCurrAI_Len - 5;
  494.   } else
  495.   {
  496.     setErrorCodeAbort(4200);
  497.     return -1;
  498.   }
  499.   theStatus = SubroutineExec;
  500.   tSubroutineIndex = theNoOfSubroutines - ((theNoOfSubroutines >> 4) << 4);
  501.   if (tSubroutineIndex == 0)
  502.   {
  503.     NdbSubroutine* tNdbSubroutine = theNdb->getNdbSubroutine();
  504.     if (tNdbSubroutine == NULL)
  505.     {
  506.       setErrorCodeAbort(4000);
  507.       return -1;
  508.     }
  509.     if (theFirstSubroutine == NULL)
  510.       theFirstSubroutine = tNdbSubroutine;
  511.     else
  512.       theLastSubroutine->theNext = tNdbSubroutine;
  513.     theLastSubroutine = tNdbSubroutine;
  514.     tNdbSubroutine->theNext = NULL;
  515.   }
  516.   theLastSubroutine->theSubroutineAddress[tSubroutineIndex] = theTotalCurrAI_Len - 
  517.     (theInitialReadSize + theInterpretedSize + 
  518.      theFinalUpdateSize + theFinalReadSize);
  519.   theNoOfSubroutines++;
  520.   theErrorLine++;
  521.   return (theNoOfSubroutines - 1);
  522. }
  523. /************************************************************************************************
  524. int NdbOperation::add_reg(Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest)
  525. ************************************************************************************************/
  526. int
  527. NdbOperation::add_reg(Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest)
  528. {
  529.   INT_DEBUG(("add_reg %u %u %u", RegSource1, RegSource2, RegDest));
  530.   if (intermediate_interpreterCheck() == -1)
  531.     return -1;
  532.   if (RegSource1 >= 8)
  533.   {
  534.     setErrorCodeAbort(4229);
  535.     return -1;
  536.   }
  537.   if (RegSource2 >= 8)
  538.   {
  539.     setErrorCodeAbort(4229);
  540.     return -1;
  541.   }
  542.   if (RegDest >= 8)
  543.   {
  544.     setErrorCodeAbort(4229);
  545.     return -1;
  546.   }
  547.   if (insertATTRINFO( Interpreter::Add(RegDest, RegSource1, RegSource2)) == -1)
  548.     return -1;
  549.   theErrorLine++;
  550.   return 0;
  551. }
  552. /************************************************************************************************
  553. int NdbOperation::sub_reg(Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest)
  554. ************************************************************************************************/
  555. int
  556. NdbOperation::sub_reg(Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest)
  557. {
  558.   INT_DEBUG(("sub_reg %u %u %u", RegSource1, RegSource2, RegDest));
  559.   if (intermediate_interpreterCheck() == -1)
  560.     return -1;
  561.   if (RegSource1 >= 8)
  562.   {
  563.     setErrorCodeAbort(4229);
  564.     return -1;
  565.   }
  566.   if (RegSource2 >= 8)
  567.   {
  568.     setErrorCodeAbort(4229);
  569.     return -1;
  570.   }
  571.   if (RegDest >= 8)
  572.   {
  573.     setErrorCodeAbort(4229);
  574.     return -1;
  575.   }
  576.   if (insertATTRINFO( Interpreter::Sub(RegDest, RegSource1, RegSource2)) == -1)
  577.     return -1;
  578.   theErrorLine++;
  579.   return 0;
  580. }
  581. /************************************************************************************************
  582. int NdbOperation::load_const_u32(Uint32 RegDest, Uint32 Constant)
  583. ************************************************************************************************/
  584. int
  585. NdbOperation::load_const_u32(Uint32 RegDest, Uint32 Constant)
  586. {
  587.   INT_DEBUG(("load_const_u32 %u %u", RegDest, Constant));
  588.   if (initial_interpreterCheck() == -1)
  589.     goto l_u32_error1;
  590.   if (RegDest >= 8)
  591.     goto l_u32_error2;
  592.   if (insertATTRINFO( Interpreter::LoadConst32(RegDest)) == -1)
  593.     goto l_u32_error1;
  594.   if (insertATTRINFO(Constant) == -1)
  595.     goto l_u32_error1;
  596.   theErrorLine++;
  597.   return 0;
  598.  l_u32_error1:
  599.   return -1;
  600.   
  601.  l_u32_error2:
  602.   setErrorCodeAbort(4229);
  603.   return -1;
  604. }
  605. /************************************************************************************************
  606. int NdbOperation::load_const_u64(Uint32 RegDest, Uint64 Constant)
  607. ************************************************************************************************/
  608. int
  609. NdbOperation::load_const_u64(Uint32 RegDest, Uint64 Constant)
  610. {
  611.   INT_DEBUG(("load_const_u64 %u %llu", RegDest, Constant));
  612.   if (initial_interpreterCheck() == -1)
  613.     return -1;
  614.   if (RegDest >= 8)
  615.   {
  616.     setErrorCodeAbort(4229);
  617.     return -1;
  618.   }
  619.   
  620.   // 64 bit value
  621.   if (insertATTRINFO( Interpreter::LoadConst64(RegDest)) == -1)
  622.     return -1;
  623.   if (insertATTRINFOloop((Uint32*)&Constant, 2) == -1)
  624.     return -1;
  625.   theErrorLine++;
  626.   return 0;
  627. }
  628. /************************************************************************************************
  629. int NdbOperation::load_const_null(Uint32 RegDest)
  630. ************************************************************************************************/
  631. int
  632. NdbOperation::load_const_null(Uint32 RegDest)
  633. {
  634.   INT_DEBUG(("load_const_null %u", RegDest));
  635.   if (initial_interpreterCheck() == -1)
  636.     return -1;
  637.   if (RegDest >= 8)
  638.   {
  639.     setErrorCodeAbort(4229);
  640.     return -1;
  641.   }
  642.   if (insertATTRINFO( Interpreter::LOAD_CONST_NULL) == -1)
  643.     return -1;
  644.   theErrorLine++;
  645.   return 0;
  646. }
  647. /************************************************************************************************
  648. int NdbOperation::read_attr(const char* anAttrName, Uint32 RegDest)
  649. ************************************************************************************************/
  650. int
  651. NdbOperation::read_attr(const NdbColumnImpl* anAttrObject, Uint32 RegDest)
  652. {
  653.   INT_DEBUG(("read_attr %d %u", anAttrObject->m_attrId, RegDest));
  654.   if (initial_interpreterCheck() == -1)
  655.     return -1;
  656.   int tAttrId = read_attrCheck(anAttrObject);
  657.   if (tAttrId == -1)
  658.     goto read_attr_error1;
  659.   if (RegDest >= 8)
  660.     goto read_attr_error2;
  661.   if (insertATTRINFO( Interpreter::Read(tAttrId, RegDest)) != -1) {
  662.     return 0;
  663.     theErrorLine++;
  664.   }//if
  665.   return -1;
  666. read_attr_error1:
  667.   return -1;
  668. read_attr_error2:
  669.   setErrorCodeAbort(4229);
  670.   return -1;
  671. }
  672. /************************************************************************************************
  673. int NdbOperation::write_attr(const char* anAttrName, Uint32 RegSource)
  674. ************************************************************************************************/
  675. int
  676. NdbOperation::write_attr(const NdbColumnImpl* anAttrObject, Uint32 RegSource)
  677. {
  678.   INT_DEBUG(("write_attr %d %u", anAttrObject->m_attrId, RegSource));
  679.   int tAttrId = write_attrCheck(anAttrObject);
  680.   if (tAttrId == -1)
  681.     return -1;
  682.   if (insertATTRINFO( Interpreter::Write(tAttrId, RegSource)) == -1)
  683.     return -1;
  684.   theErrorLine++;
  685.   return 0;
  686. }
  687. int
  688. NdbOperation::branch_reg_reg(Uint32 type,
  689.      Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  690. {
  691.   if (intermediate_interpreterCheck() == -1)
  692.     return -1;
  693.   if (insertATTRINFO(Interpreter::Branch(type, RegLvalue, RegRvalue)) == -1)
  694.     return -1;
  695.   if (insertBranch(Label) == -1)
  696.     return -1;
  697.   theErrorLine++;
  698.   return 0;
  699. }
  700. int
  701. NdbOperation::branch_ge(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  702. {
  703.   INT_DEBUG(("branch_ge %u %u %u", RegLvalue, RegRvalue, Label));
  704.   return branch_reg_reg(Interpreter::BRANCH_GE_REG_REG,
  705. RegLvalue, RegRvalue, Label);
  706. }
  707. int
  708. NdbOperation::branch_gt(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  709. {
  710.   INT_DEBUG(("branch_gt %u %u %u", RegLvalue, RegRvalue, Label));
  711.   return branch_reg_reg(Interpreter::BRANCH_GT_REG_REG,
  712. RegLvalue, RegRvalue, Label);
  713. }
  714. int
  715. NdbOperation::branch_le(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  716. {
  717.   INT_DEBUG(("branch_le %u %u %u", RegLvalue, RegRvalue, Label));
  718.   return branch_reg_reg(Interpreter::BRANCH_LE_REG_REG,
  719. RegLvalue, RegRvalue, Label);
  720. }
  721. int
  722. NdbOperation::branch_lt(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  723. {
  724.   INT_DEBUG(("branch_lt %u %u %u", RegLvalue, RegRvalue, Label));
  725.   return branch_reg_reg(Interpreter::BRANCH_LT_REG_REG,
  726. RegLvalue, RegRvalue, Label);
  727. }
  728. int
  729. NdbOperation::branch_eq(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  730. {
  731.   INT_DEBUG(("branch_eq %u %u %u", RegLvalue, RegRvalue, Label));
  732.   return branch_reg_reg(Interpreter::BRANCH_EQ_REG_REG,
  733. RegLvalue, RegRvalue, Label);
  734. }
  735. int
  736. NdbOperation::branch_ne(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label)
  737. {
  738.   INT_DEBUG(("branch_ne %u %u %u", RegLvalue, RegRvalue, Label));
  739.   return branch_reg_reg(Interpreter::BRANCH_NE_REG_REG,
  740. RegLvalue, RegRvalue, Label);
  741. }
  742. int
  743. NdbOperation::branch_ne_null(Uint32 RegLvalue, Uint32 Label)
  744. {
  745.   INT_DEBUG(("branch_ne_null %u %u", RegLvalue, Label));
  746.   if (intermediate_interpreterCheck() == -1)
  747.     return -1;
  748.   if (insertATTRINFO((RegLvalue << 6) + Interpreter::BRANCH_REG_NE_NULL) == -1)
  749.     return -1;
  750.   if (insertBranch(Label) == -1)
  751.     return -1;
  752.   theErrorLine++;
  753.   return 0;
  754. }
  755. int
  756. NdbOperation::branch_eq_null(Uint32 RegLvalue, Uint32 Label)
  757. {
  758.   INT_DEBUG(("branch_eq_null %u %u", RegLvalue, Label));
  759.   if (intermediate_interpreterCheck() == -1)
  760.     return -1;
  761.   if (insertATTRINFO((RegLvalue << 6) + Interpreter::BRANCH_REG_EQ_NULL) == -1)
  762.     return -1;
  763.   if (insertBranch(Label) == -1)
  764.     return -1;
  765.   theErrorLine++;
  766.   return 0;
  767. }
  768. int
  769. NdbOperation::branch_label(Uint32 Label)
  770. {
  771.   INT_DEBUG(("branch_label %u", Label));
  772.   if (initial_interpreterCheck() == -1)
  773.     return -1;
  774.   if (insertATTRINFO(Interpreter::BRANCH) == -1)
  775.     return -1;
  776.   if (insertBranch(Label) == -1)
  777.     return -1;
  778.   theErrorLine++;
  779.   return 0;
  780. }
  781. /************************************************************************************************
  782. int NdbOperation::interpret_exit_ok()
  783. ************************************************************************************************/
  784. int
  785. NdbOperation::interpret_exit_ok()
  786. {
  787.   INT_DEBUG(("interpret_exit_ok"));
  788.   if (initial_interpreterCheck() == -1)
  789.     return -1;
  790.   if (insertATTRINFO(Interpreter::EXIT_OK) == -1)
  791.     return -1;
  792.   theErrorLine++;
  793.   return 0;
  794. }
  795. int
  796. NdbOperation::interpret_exit_last_row()
  797. {
  798.   INT_DEBUG(("interpret_exit_last_row"));
  799.   if (initial_interpreterCheck() == -1)
  800.     return -1;
  801.   if (insertATTRINFO(Interpreter::EXIT_OK_LAST) == -1)
  802.     return -1;
  803.   theErrorLine++;
  804.   return 0;
  805. }
  806. /************************************************************************************************
  807. int NdbOperation::interpret_exit_nok(Uint32 ErrorCode)
  808. ************************************************************************************************/
  809. int
  810. NdbOperation::interpret_exit_nok(Uint32 ErrorCode)
  811. {
  812.   INT_DEBUG(("interpret_exit_nok %u", ErrorCode));
  813.   if (initial_interpreterCheck() == -1)
  814.     return -1;
  815.   if (insertATTRINFO( (ErrorCode << 16) + Interpreter::EXIT_REFUSE) == -1)
  816.     return -1;
  817.   theErrorLine++;
  818.   return 0;
  819. }
  820. int
  821. NdbOperation::interpret_exit_nok()
  822. {
  823.   INT_DEBUG(("interpret_exit_nok"));
  824.   Uint32 ErrorCode = 899;
  825.   if (initial_interpreterCheck() == -1)
  826.     return -1;
  827.   if (insertATTRINFO( (ErrorCode << 16) + Interpreter::EXIT_REFUSE) == -1)
  828.     return -1;
  829.   theErrorLine++;
  830.   return 0;
  831. }
  832. int
  833. NdbOperation::call_sub(Uint32 Subroutine)
  834. {
  835.   INT_DEBUG(("call_sub %u", Subroutine));
  836.   if (initial_interpreterCheck() == -1)
  837.     return -1;
  838.   if (insertATTRINFO( (Subroutine << 16) + Interpreter::CALL) == -1)
  839.     return -1;
  840.   if (insertCall(Subroutine) == -1)
  841.     return -1;
  842.   theErrorLine++;
  843.   return 0;
  844. }
  845. int
  846. NdbOperation::ret_sub()
  847. {
  848.   INT_DEBUG(("ret_sub"));
  849.   if (theInterpretIndicator != 1)
  850.   {
  851.     setErrorCodeAbort(4200);
  852.     return -1;
  853.   }
  854.   if (theStatus == SubroutineExec)
  855.   {
  856.      ; // Simply continue with interpretation
  857.   } else
  858.   {
  859.     setErrorCodeAbort(4200);
  860.     return -1;
  861.   }
  862.   if (insertATTRINFO(Interpreter::RETURN) == -1)
  863.     return -1;
  864.   theStatus = SubroutineEnd;
  865.   theErrorLine++;
  866.   return 0;
  867. }
  868. int
  869. NdbOperation::insertBranch(Uint32 aLabel)
  870. {
  871.   Uint32 tAddress;
  872.   NdbBranch* tBranch = theNdb->getNdbBranch();
  873.   if (tBranch == NULL)
  874.     goto insertBranch_error1;
  875.   if (theFirstBranch == NULL)
  876.     theFirstBranch = tBranch;
  877.   else
  878.     theLastBranch->theNext = tBranch;
  879.   theLastBranch = tBranch;
  880.   if (theNoOfSubroutines == 0)
  881.     tAddress = theTotalCurrAI_Len - 
  882.        (theInitialReadSize + 5);
  883.   else
  884.     tAddress = theTotalCurrAI_Len - 
  885.       (theInitialReadSize + theInterpretedSize +
  886.        theFinalUpdateSize + theFinalReadSize + 5);
  887.   tBranch->theBranchAddress = tAddress;
  888.   tBranch->theSignal = theCurrentATTRINFO;
  889.   tBranch->theSignalAddress = theAI_LenInCurrAI; // + 1;  theAI_LenInCurrAI has already been updated in
  890.   tBranch->theSubroutine = theNoOfSubroutines;   //       insertATTRINFO which was done before insertBranch!!
  891.   tBranch->theBranchLabel = aLabel;
  892.   return 0;
  893. insertBranch_error1:
  894.   setErrorCodeAbort(4000);
  895.   return -1;
  896. }
  897. int
  898. NdbOperation::insertCall(Uint32 aCall)
  899. {
  900.   NdbCall* tCall = theNdb->getNdbCall();
  901.   if (tCall == NULL)
  902.   {
  903.     setErrorCodeAbort(4000);
  904.     return -1;
  905.   }
  906.   if (theFirstCall == NULL)
  907.     theFirstCall = tCall;
  908.   else
  909.     theLastCall->theNext = tCall;
  910.   theLastCall = tCall;
  911.   tCall->theSignal = theCurrentATTRINFO;
  912.   tCall->theSignalAddress = theAI_LenInCurrAI;
  913.   tCall->theSubroutine = aCall;
  914.   return 0;
  915. }
  916. int
  917. NdbOperation::branch_col(Uint32 type, 
  918.  Uint32 ColId, const char * val, Uint32 len, 
  919.  bool nopad, Uint32 Label){
  920.   if (initial_interpreterCheck() == -1)
  921.     return -1;
  922.   Interpreter::BinaryCondition c = (Interpreter::BinaryCondition)type;
  923.   const NdbDictionary::Column * col = 
  924.     m_currentTable->getColumn(ColId);
  925.   
  926.   if(col == 0){
  927.     abort();
  928.   }
  929.   Uint32 vc = col->getType() == NdbDictionary::Column::Varchar;
  930.   Uint32 colLen = col->getLength() + 2 * vc;
  931.   Uint32 al = (4 - (colLen & 3)) & 0x3;
  932.   
  933.   if (insertATTRINFO(Interpreter::BranchCol(c, al, vc, nopad)) == -1)
  934.     return -1;
  935.   
  936.   if (insertBranch(Label) == -1)
  937.     return -1;
  938.   
  939.   if (insertATTRINFO(Interpreter::BranchCol_2(ColId, len)))
  940.     return -1;
  941.   
  942.   Uint32 len2 = Interpreter::mod4(len);
  943.   if(len2 == len){
  944.     insertATTRINFOloop((Uint32*)val, len2 >> 2);
  945.   } else {
  946.     len2 -= 4;
  947.     insertATTRINFOloop((Uint32*)val, len2 >> 2);
  948.     Uint32 tmp = 0;
  949.     for (Uint32 i = 0; i < len-len2; i++) {
  950.       char* p = (char*)&tmp;
  951.       p[i] = val[len2+i];
  952.     }
  953.     insertATTRINFO(tmp);
  954.   }
  955.   
  956.   theErrorLine++;
  957.   return 0;
  958. }
  959. int 
  960. NdbOperation::branch_col_eq(Uint32 ColId, const char * val, Uint32 len, 
  961.     bool nopad, Uint32 Label){
  962.   INT_DEBUG(("branch_col_eq %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  963.   return branch_col(Interpreter::EQ, ColId, val, len, nopad, Label);
  964. }
  965. int
  966. NdbOperation::branch_col_ne(Uint32 ColId, const char * val, Uint32 len, 
  967.     bool nopad, Uint32 Label){
  968.   INT_DEBUG(("branch_col_ne %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  969.   return branch_col(Interpreter::NE, ColId, val, len, nopad, Label);
  970. }
  971. int
  972. NdbOperation::branch_col_lt(Uint32 ColId, const char * val, Uint32 len, 
  973.     bool nopad, Uint32 Label){
  974.   INT_DEBUG(("branch_col_lt %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  975.   return branch_col(Interpreter::LT, ColId, val, len, nopad, Label);
  976. }
  977. int
  978. NdbOperation::branch_col_le(Uint32 ColId, const char * val, Uint32 len, 
  979.     bool nopad, Uint32 Label){
  980.   INT_DEBUG(("branch_col_le %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  981.   return branch_col(Interpreter::LE, ColId, val, len, nopad, Label);
  982. }
  983. int
  984. NdbOperation::branch_col_gt(Uint32 ColId, const char * val, Uint32 len, 
  985.     bool nopad, Uint32 Label){
  986.   INT_DEBUG(("branch_col_gt %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  987.   return branch_col(Interpreter::GT, ColId, val, len, nopad, Label);
  988. }
  989. int
  990. NdbOperation::branch_col_ge(Uint32 ColId, const char * val, Uint32 len, 
  991.     bool nopad, Uint32 Label){
  992.   INT_DEBUG(("branch_col_ge %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  993.   return branch_col(Interpreter::GE, ColId, val, len, nopad, Label);
  994. }
  995. int
  996. NdbOperation::branch_col_like(Uint32 ColId, const char * val, Uint32 len, 
  997.       bool nopad, Uint32 Label){
  998.   INT_DEBUG(("branch_col_like %u %.*s(%u,%d) -> %u", ColId, len, val, len, nopad, Label));
  999.   return branch_col(Interpreter::LIKE, ColId, val, len, nopad, Label);
  1000. }
  1001. int
  1002. NdbOperation::branch_col_notlike(Uint32 ColId, const char * val, Uint32 len, 
  1003.       bool nopad, Uint32 Label){
  1004.   INT_DEBUG(("branch_col_notlike %u %.*s(%u,%d) -> %u", ColId,len,val,len,nopad,Label));
  1005.   return branch_col(Interpreter::NOT_LIKE, ColId, val, len, nopad, Label);
  1006. }
  1007. int
  1008. NdbOperation::branch_col_null(Uint32 type, Uint32 ColId, Uint32 Label){
  1009.   
  1010.   if (initial_interpreterCheck() == -1)
  1011.     return -1;
  1012.   
  1013.   if (insertATTRINFO(type) == -1)
  1014.     return -1;
  1015.   
  1016.   if (insertBranch(Label) == -1)
  1017.     return -1;
  1018.   
  1019.   if (insertATTRINFO(Interpreter::BranchCol_2(ColId)))
  1020.     return -1;
  1021.   
  1022.   theErrorLine++;
  1023.   return 0;
  1024. }
  1025. int
  1026. NdbOperation::branch_col_eq_null(Uint32 ColId, Uint32 Label){
  1027.   
  1028.   INT_DEBUG(("branch_col_eq_null %u -> %u", ColId, Label));
  1029.   return branch_col_null(Interpreter::BRANCH_ATTR_EQ_NULL, ColId, Label);
  1030. }
  1031. int
  1032. NdbOperation::branch_col_ne_null(Uint32 ColId, Uint32 Label){
  1033.   
  1034.   INT_DEBUG(("branch_col_ne_null %u -> %u", ColId, Label));
  1035.   return branch_col_null(Interpreter::BRANCH_ATTR_NE_NULL, ColId, Label);
  1036. }