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

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. #ifndef NdbOperation_H
  14. #define NdbOperation_H
  15. #include <ndb_types.h>
  16. #include "ndbapi_limits.h"
  17. #include "NdbError.hpp"
  18. #include "NdbReceiver.hpp"
  19. #include "NdbDictionary.hpp"
  20. #include "Ndb.hpp"
  21. class Ndb;
  22. class NdbApiSignal;
  23. class NdbRecAttr;
  24. class NdbOperation;
  25. class NdbConnection;
  26. class NdbColumnImpl;
  27. class NdbBlob;
  28. /**
  29.  * @class NdbOperation
  30.  * @brief Class of operations for use in transactions.  
  31.  */
  32. class NdbOperation
  33. {
  34.   friend class Ndb;
  35.   friend class NdbConnection;
  36.   friend class NdbScanOperation;
  37.   friend class NdbScanReceiver;
  38.   friend class NdbScanFilter;
  39.   friend class NdbScanFilterImpl;
  40.   friend class NdbReceiver;
  41.   friend class NdbBlob;
  42. public:
  43.   /** 
  44.    * @name Define Standard Operation Type
  45.    * @{
  46.    */
  47.   /**
  48.    * Lock when performing read
  49.    */
  50.   
  51.   enum LockMode {
  52.     LM_Read = 0,
  53.     LM_Exclusive = 1,
  54.     LM_CommittedRead = 2,
  55. #ifndef DOXYGEN_SHOULD_SKIP_INTERNAL
  56.     LM_Dirty = 2
  57. #endif
  58.   };
  59.   /**
  60.    * Define the NdbOperation to be a standard operation of type insertTuple.
  61.    * When calling NdbConnection::execute, this operation 
  62.    * adds a new tuple to the table.
  63.    *
  64.    * @return 0 if successful otherwise -1.
  65.    */
  66.   virtual int  insertTuple();
  67.   /**
  68.    * Define the NdbOperation to be a standard operation of type updateTuple.
  69.    * When calling NdbConnection::execute, this operation 
  70.    * updates a tuple in the table.
  71.    *
  72.    * @return 0 if successful otherwise -1.
  73.    */  
  74.   virtual int  updateTuple();
  75.   /**
  76.    * Define the NdbOperation to be a standard operation of type writeTuple.
  77.    * When calling NdbConnection::execute, this operation 
  78.    * writes a tuple to the table.
  79.    * If the tuple exists, it updates it, otherwise an insert takes place.
  80.    *
  81.    * @return 0 if successful otherwise -1.
  82.    */  
  83.   virtual int  writeTuple();
  84.   /**
  85.    * Define the NdbOperation to be a standard operation of type deleteTuple.
  86.    * When calling NdbConnection::execute, this operation 
  87.    * delete a tuple.
  88.    *
  89.    * @return 0 if successful otherwise -1.
  90.    */
  91.   virtual int  deleteTuple();
  92.   /**
  93.    * Define the NdbOperation to be a standard operation of type readTuple.
  94.    * When calling NdbConnection::execute, this operation 
  95.    * reads a tuple.
  96.    *
  97.    * @return 0 if successful otherwise -1.
  98.    */
  99.   virtual int  readTuple(LockMode);
  100.   /**
  101.    * Define the NdbOperation to be a standard operation of type readTuple.
  102.    * When calling NdbConnection::execute, this operation 
  103.    * reads a tuple.
  104.    *
  105.    * @return 0 if successful otherwise -1.
  106.    */  
  107.   virtual int  readTuple();
  108.   /**
  109.    * Define the NdbOperation to be a standard operation of type 
  110.    * readTupleExclusive.
  111.    * When calling NdbConnection::execute, this operation 
  112.    * read a tuple using an exclusive lock.
  113.    *
  114.    * @return 0 if successful otherwise -1.
  115.    */
  116.   virtual int  readTupleExclusive();
  117.   /**
  118.    * Define the NdbOperation to be a standard operation of type 
  119.    * simpleRead.
  120.    * When calling NdbConnection::execute, this operation 
  121.    * reads an existing tuple (using shared read lock), 
  122.    * but releases lock immediately after read.
  123.    *
  124.    * @note  Using this operation twice in the same transaction
  125.    *        may produce different results (e.g. if there is another
  126.    *        transaction which updates the value between the
  127.    *        simple reads).
  128.    *
  129.    * Note that simpleRead can read the value from any database node while
  130.    * standard read always read the value on the database node which is 
  131.    * primary for the record.
  132.    *
  133.    * @return 0 if successful otherwise -1.
  134.    */
  135.   virtual int simpleRead();
  136. #ifndef DOXYGEN_SHOULD_SKIP_DEPRECATED
  137.   /**
  138.    * Define the NdbOperation to be a standard operation of type committedRead.
  139.    * When calling NdbConnection::execute, this operation 
  140.    * read latest committed value of the record.
  141.    *
  142.    * This means that if another transaction is updating the 
  143.    * record, then the current transaction will not wait.  
  144.    * It will instead use the latest committed value of the 
  145.    * record.
  146.    * dirtyRead is a deprecated name for committedRead
  147.    *
  148.    * @return 0 if successful otherwise -1.
  149.    * @depricated
  150.    */
  151.   virtual int dirtyRead();
  152. #endif
  153.   /**
  154.    * Define the NdbOperation to be a standard operation of type committedRead.
  155.    * When calling NdbConnection::execute, this operation 
  156.    * read latest committed value of the record.
  157.    *
  158.    * This means that if another transaction is updating the 
  159.    * record, then the current transaction will not wait.  
  160.    * It will instead use the latest committed value of the 
  161.    * record.
  162.    *
  163.    * @return 0 if successful otherwise -1.
  164.    */
  165.   virtual int committedRead();
  166.   /**
  167.    * Define the NdbOperation to be a standard operation of type dirtyUpdate.
  168.    * When calling NdbConnection::execute, this operation 
  169.    * updates without two-phase commit.
  170.    *
  171.    * @return 0 if successful otherwise -1.
  172.    */
  173.   virtual int dirtyUpdate();
  174.   /**
  175.    * Define the NdbOperation to be a standard operation of type dirtyWrite.
  176.    * When calling NdbConnection::execute, this operation 
  177.    * writes without two-phase commit.
  178.    *
  179.    * @return 0 if successful otherwise -1.
  180.    */
  181.   virtual int dirtyWrite();
  182.   /** @} *********************************************************************/
  183.   /** 
  184.    * @name Define Interpreted Program Operation Type
  185.    * @{
  186.    */
  187.   /**
  188.    * Update a tuple using an interpreted program.
  189.    *
  190.    * @return 0 if successful otherwise -1.
  191.    */  
  192.   virtual int interpretedUpdateTuple();
  193.   /**
  194.    * Delete a tuple using an interpreted program.
  195.    *
  196.    * @return 0 if successful otherwise -1.
  197.    */
  198.   virtual int interpretedDeleteTuple();
  199.   /** @} *********************************************************************/
  200.   /** 
  201.    * @name Specify Search Conditions
  202.    * @{
  203.    */
  204.   /**
  205.    * Define a search condition with equality.
  206.    * The condition is true if the attribute has the given value.
  207.    * To set search conditions on multiple attributes,
  208.    * use several equals (then all of them must be satisfied for the
  209.    * tuple to be selected).
  210.    *
  211.    * @note There are 10 versions of NdbOperation::equal with
  212.    *       slightly different parameters.
  213.    *
  214.    * @note When using NdbOperation::equal with a string (char *) as
  215.    *       second argument, the string needs to be padded with 
  216.    *       zeros in the following sense:
  217.    *       @code
  218.    *       // Equal needs strings to be padded with zeros
  219.    *       strncpy(buf, str, sizeof(buf));
  220.    *       NdbOperation->equal("Attr1", buf);
  221.    *       @endcode
  222.    * 
  223.    * @param   anAttrName   Attribute name 
  224.    * @param   aValue       Attribute value.
  225.    * @param   len          Attribute length expressed in bytes.
  226.    * @return               -1 if unsuccessful. 
  227.    */
  228.   int  equal(const char* anAttrName, const char* aValue, Uint32 len = 0);
  229.   int  equal(const char* anAttrName, Uint32 aValue);
  230.   int  equal(const char* anAttrName, Int32 aValue);
  231.   int  equal(const char* anAttrName, Int64 aValue);
  232.   int  equal(const char* anAttrName, Uint64 aValue);
  233.   int  equal(Uint32 anAttrId, const char* aValue, Uint32 len = 0);
  234.   int  equal(Uint32 anAttrId, Int32 aValue);
  235.   int  equal(Uint32 anAttrId, Uint32 aValue);
  236.   int  equal(Uint32 anAttrId, Int64 aValue);
  237.   int  equal(Uint32 anAttrId, Uint64 aValue);
  238.   /**
  239.    * Generate a tuple id and set it as search argument.
  240.    *
  241.    * The Tuple id has NDB$TID as attribute name and 0 as attribute id.
  242.    *
  243.    * The generated tuple id is returned by the method.
  244.    * If zero is returned there is an error.
  245.    *
  246.    * This is mostly used for tables without any primary key 
  247.    * attributes.
  248.    * 
  249.    * @return    Generated tuple id if successful, otherwise 0.
  250.    */
  251.   Uint64       setTupleId();
  252.   /** @} *********************************************************************/
  253.   /** 
  254.    * @name Specify Attribute Actions for Operations
  255.    * @{
  256.    */
  257.   /**
  258.    * Defines a retrieval operation of an attribute value.
  259.    * The NDB API allocate memory for the NdbRecAttr object that
  260.    * will hold the returned attribute value. 
  261.    *
  262.    * @note Note that it is the applications responsibility
  263.    *       to allocate enough memory for aValue (if non-NULL).
  264.    *       The buffer aValue supplied by the application must be
  265.    *       aligned appropriately.  The buffer is used directly
  266.    *       (avoiding a copy penalty) only if it is aligned on a
  267.    *       4-byte boundary and the attribute size in bytes
  268.    *       (i.e. NdbRecAttr::attrSize times NdbRecAttr::arraySize is
  269.    *       a multiple of 4).
  270.    *
  271.    * @note There are two versions of NdbOperation::getValue with
  272.    *       slightly different parameters.
  273.    *
  274.    * @note This method does not fetch the attribute value from 
  275.    *       the database!  The NdbRecAttr object returned by this method 
  276.    *       is <em>not</em> readable/printable before the 
  277.    *       transaction has been executed with NdbConnection::execute.
  278.    *
  279.    * @param anAttrName  Attribute name 
  280.    * @param aValue      If this is non-NULL, then the attribute value 
  281.    *                    will be returned in this parameter.<br>
  282.    *                    If NULL, then the attribute value will only 
  283.    *                    be stored in the returned NdbRecAttr object.
  284.    * @return            An NdbRecAttr object to hold the value of 
  285.    *                    the attribute, or a NULL pointer 
  286.    *                    (indicating error).
  287.    */
  288.   NdbRecAttr* getValue(const char* anAttrName, char* aValue = 0);
  289.   NdbRecAttr* getValue(Uint32 anAttrId, char* aValue = 0);
  290.   NdbRecAttr* getValue(const NdbDictionary::Column*, char* val = 0);
  291.   
  292.   /**
  293.    * Define an attribute to set or update in query.
  294.    *
  295.    * To set a NULL value, use the following construct:
  296.    * @code
  297.    *   setValue("ATTR_NAME", (char*)NULL);
  298.    * @endcode
  299.    * 
  300.    * There are a number of NdbOperation::setValue methods that 
  301.    * take a certain type as input
  302.    * (pass by value rather than passing a pointer). 
  303.    * As the interface is currently implemented it is the responsibility 
  304.    * of the application programmer to use the correct types.
  305.    *
  306.    * The NDB API will however check that the application sends
  307.    * a correct length to the interface as given in the length parameter.  
  308.    * The passing of char* as the value can contain any type or 
  309.    * any type of array. 
  310.    * If length is not provided or set to zero, 
  311.    * then the API will assume that the pointer
  312.    * is correct and not bother with checking it.
  313.    *
  314.    * @note There are 14 versions of NdbOperation::setValue with
  315.    *       slightly different parameters.
  316.    * 
  317.    * @param anAttrName     Name (or Id) of attribute.
  318.    * @param aValue         Attribute value to set.
  319.    * @param len            Attribute length expressed in bytes.
  320.    * @return               -1 if unsuccessful.
  321.    */
  322.   virtual int  setValue(const char* anAttrName, const char* aValue, 
  323. Uint32 len = 0);
  324.   virtual int  setValue(const char* anAttrName, Int32 aValue);
  325.   virtual int  setValue(const char* anAttrName, Uint32 aValue);
  326.   virtual int  setValue(const char* anAttrName, Uint64 aValue);
  327.   virtual int  setValue(const char* anAttrName, Int64 aValue);
  328.   virtual int  setValue(const char* anAttrName, float aValue);
  329.   virtual int  setValue(const char* anAttrName, double aValue);
  330.   virtual int  setValue(Uint32 anAttrId, const char* aValue, Uint32 len = 0);
  331.   virtual int  setValue(Uint32 anAttrId, Int32 aValue);
  332.   virtual int  setValue(Uint32 anAttrId, Uint32 aValue);
  333.   virtual int  setValue(Uint32 anAttrId, Uint64 aValue);
  334.   virtual int  setValue(Uint32 anAttrId, Int64 aValue);
  335.   virtual int  setValue(Uint32 anAttrId, float aValue);
  336.   virtual int  setValue(Uint32 anAttrId, double aValue);
  337.   /**
  338.    * This method replaces getValue/setValue for blobs.  It creates
  339.    * a blob handle NdbBlob.  A second call with same argument returns
  340.    * the previously created handle.  The handle is linked to the
  341.    * operation and is maintained automatically.
  342.    *
  343.    * See NdbBlob for details.
  344.    */
  345.   virtual NdbBlob* getBlobHandle(const char* anAttrName);
  346.   virtual NdbBlob* getBlobHandle(Uint32 anAttrId);
  347.  
  348.   /** @} *********************************************************************/
  349.   /** 
  350.    * @name Specify Interpreted Program Instructions
  351.    * @{
  352.    */
  353.   /**
  354.    * Interpreted program instruction: Add a value to an attribute.
  355.    *
  356.    * @note Destroys the contents of registers 6 and 7.
  357.    *       (The instruction uses these registers for its operation.)
  358.    *
  359.    * @note There are four versions of NdbOperation::incValue with
  360.    *       slightly different parameters.
  361.    *
  362.    * @param anAttrName     Attribute name.
  363.    * @param aValue         Value to add.
  364.    * @return               -1 if unsuccessful.
  365.    */
  366.   int   incValue(const char* anAttrName, Uint32 aValue);
  367.   int   incValue(const char* anAttrName, Uint64 aValue);
  368.   int   incValue(Uint32 anAttrId, Uint32 aValue);
  369.   int   incValue(Uint32 anAttrId, Uint64 aValue);
  370.   /**
  371.    * Interpreted program instruction:
  372.    * Subtract a value from an attribute in an interpreted operation.
  373.    *
  374.    * @note Destroys the contents of registers 6 and 7.
  375.    *       (The instruction uses these registers for its operation.)
  376.    *
  377.    * @note There are four versions of NdbOperation::subValue with
  378.    *       slightly different parameters.
  379.    *
  380.    * @param anAttrName    Attribute name.
  381.    * @param aValue        Value to subtract.
  382.    * @return              -1 if unsuccessful.
  383.    */
  384.   int   subValue(const char* anAttrName, Uint32 aValue);
  385.   int   subValue(const char* anAttrName, Uint64 aValue);
  386.   int   subValue(Uint32 anAttrId, Uint32 aValue);
  387.   int   subValue(Uint32 anAttrId, Uint64 aValue);
  388.   /**
  389.    * Interpreted program instruction:
  390.    * Define a jump label in an interpreted operation.
  391.    *
  392.    * @note The labels are automatically numbered starting with 0.  
  393.    *       The parameter used by NdbOperation::def_label should 
  394.    *       match the automatic numbering to make it easier to 
  395.    *       debug the interpreted program.
  396.    * 
  397.    * @param labelNumber   Label number.
  398.    * @return              -1 if unsuccessful.
  399.    */
  400.   int   def_label(int labelNumber);
  401.   /**
  402.    * Interpreted program instruction:
  403.    * Add two registers into a third.
  404.    *
  405.    * @param RegSource1   First register.
  406.    * @param RegSource2   Second register.
  407.    * @param RegDest      Destination register where the result will be stored.
  408.    * @return -1 if unsuccessful.
  409.    */
  410.   int   add_reg(Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest);
  411.   /**
  412.    * Interpreted program instruction:
  413.    * Substract RegSource1 from RegSource2 and put the result in RegDest.
  414.    *
  415.    * @param RegSource1   First register.
  416.    * @param RegSource2   Second register.
  417.    * @param RegDest      Destination register where the result will be stored.
  418.    * @return             -1 if unsuccessful.
  419.    */
  420.   int   sub_reg(Uint32 RegSource1, Uint32 RegSource2, Uint32 RegDest);
  421.   /**
  422.    * Interpreted program instruction:
  423.    * Load a constant into a register.
  424.    *
  425.    * @param RegDest      Destination register.
  426.    * @param Constant     Value to load.
  427.    * @return             -1 if unsuccessful.
  428.    */
  429.   int   load_const_u32(Uint32 RegDest, Uint32 Constant);
  430.   int   load_const_u64(Uint32 RegDest, Uint64 Constant);
  431.   /**
  432.    * Interpreted program instruction:
  433.    * Load NULL value into a register.
  434.    *
  435.    * @param RegDest      Destination register.
  436.    * @return             -1 if unsuccessful.
  437.    */ 
  438.   int   load_const_null(Uint32 RegDest);
  439.   /**
  440.    * Interpreted program instruction:
  441.    * Read an attribute into a register.
  442.    *
  443.    * @param anAttrName   Attribute name.
  444.    * @param RegDest      Destination register.
  445.    * @return             -1 if unsuccessful.
  446.    */
  447.   int   read_attr(const char* anAttrName, Uint32 RegDest);
  448.   /**
  449.    * Interpreted program instruction:
  450.    * Write an attribute from a register. 
  451.    *
  452.    * @param anAttrName   Attribute name.
  453.    * @param RegSource    Source register.
  454.    * @return             -1 if unsuccessful.
  455.    */
  456.   int   write_attr(const char* anAttrName, Uint32 RegSource);
  457.   /**
  458.    * Interpreted program instruction:
  459.    * Read an attribute into a register.
  460.    *
  461.    * @param anAttrId the attribute id.
  462.    * @param RegDest the destination register.
  463.    * @return -1 if unsuccessful.
  464.    */
  465.   int   read_attr(Uint32 anAttrId, Uint32 RegDest);
  466.   /**
  467.    * Interpreted program instruction:
  468.    * Write an attribute from a register. 
  469.    *
  470.    * @param anAttrId the attribute id.
  471.    * @param RegSource the source register.
  472.    * @return -1 if unsuccessful.
  473.    */
  474.   int   write_attr(Uint32 anAttrId, Uint32 RegSource);
  475.   /**
  476.    * Interpreted program instruction:
  477.    * Define a search condition. Last two letters in the function name 
  478.    * describes the search condition.
  479.    * The condition compares RegR with RegL and therefore appears
  480.    * to be reversed.
  481.    *
  482.    * - ge RegR >= RegL
  483.    * - gt RegR >  RegL
  484.    * - le RegR <= RegL
  485.    * - lt RegR <  RegL
  486.    * - eq RegR =  RegL
  487.    * - ne RegR <> RegL
  488.    *
  489.    * @param RegLvalue left value. 
  490.    * @param RegRvalue right value.
  491.    * @param Label the label to jump to.
  492.    * @return -1 if unsuccessful.
  493.    */
  494.   int   branch_ge(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label);
  495.   int   branch_gt(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label);
  496.   int   branch_le(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label);
  497.   int   branch_lt(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label);
  498.   int   branch_eq(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label);
  499.   int   branch_ne(Uint32 RegLvalue, Uint32 RegRvalue, Uint32 Label);
  500.   /**
  501.    * Interpreted program instruction:
  502.    * Jump to Label if RegLvalue is not NULL.
  503.    *
  504.    * @param RegLvalue the value to check.
  505.    * @param Label the label to jump to.
  506.    * @return -1 if unsuccessful. 
  507.    */
  508.   int   branch_ne_null(Uint32 RegLvalue, Uint32 Label);
  509.   /**
  510.    * Interpreted program instruction:
  511.    * Jump to Label if RegLvalue is equal to NULL.
  512.    *
  513.    * @param  RegLvalue  Value to check.
  514.    * @param  Label      Label to jump to.
  515.    * @return -1 if unsuccessful. 
  516.    */
  517.   int   branch_eq_null(Uint32 RegLvalue, Uint32 Label);
  518.   /**
  519.    * Interpreted program instruction:
  520.    * Jump to Label.
  521.    *
  522.    * @param  Label  Label to jump to.
  523.    * @return -1 if unsuccessful.
  524.    */
  525.   int   branch_label(Uint32 Label);
  526.   /**
  527.    * Interpreted program instruction:  branch after memcmp
  528.    * @param  ColId   Column to check
  529.    * @param  Label   Label to jump to
  530.    * @return -1 if unsuccessful
  531.    */
  532.   int branch_col_eq_null(Uint32 ColId, Uint32 Label);
  533.   int branch_col_ne_null(Uint32 ColId, Uint32 Label);
  534.   /**
  535.    * Interpreted program instruction:  branch after memcmp
  536.    * @param  ColId   column to check
  537.    * @param  val     search value
  538.    * @param  len     length of search value   
  539.    * @param  nopad   force non-padded comparison for a Char column
  540.    * @param  Label   label to jump to
  541.    * @return -1 if unsuccessful
  542.    */
  543.   int branch_col_eq(Uint32 ColId, const char * val, Uint32 len, 
  544.     bool nopad, Uint32 Label);
  545.   int branch_col_ne(Uint32 ColId, const char * val, Uint32 len, 
  546.     bool nopad, Uint32 Label);
  547.   int branch_col_lt(Uint32 ColId, const char * val, Uint32 len, 
  548.     bool nopad, Uint32 Label);
  549.   int branch_col_le(Uint32 ColId, const char * val, Uint32 len, 
  550.     bool nopad, Uint32 Label);
  551.   int branch_col_gt(Uint32 ColId, const char * val, Uint32 len, 
  552.     bool nopad, Uint32 Label);
  553.   int branch_col_ge(Uint32 ColId, const char * val, Uint32 len, 
  554.     bool nopad, Uint32 Label);
  555.   int branch_col_like(Uint32 ColId, const char *, Uint32 len, 
  556.       bool nopad, Uint32 Label);
  557.   int branch_col_notlike(Uint32 ColId, const char *, Uint32 len, 
  558.  bool nopad, Uint32 Label);
  559.   
  560.   /**
  561.    * Interpreted program instruction: Exit with Ok
  562.    *
  563.    * For scanning transactions,
  564.    * end interpreted operation and return the row to the application.
  565.    *
  566.    * For non-scanning transactions,
  567.    * exit interpreted program.
  568.    *
  569.    * @return -1 if unsuccessful.
  570.    */
  571.   int interpret_exit_ok();
  572.   /**
  573.    * Interpreted program instruction: Exit with Not Ok
  574.    *
  575.    * For scanning transactions, 
  576.    * continue with the next row without returning the current row.
  577.    *
  578.    * For non-scanning transactions,
  579.    * abort the whole transaction.
  580.    *
  581.    * @note A method also exists without the error parameter.
  582.    * 
  583.    * @param ErrorCode   An error code given by the application programmer.
  584.    * @return            -1 if unsuccessful.
  585.    */
  586.   int   interpret_exit_nok(Uint32 ErrorCode);
  587.   int   interpret_exit_nok();
  588.   
  589.   /**
  590.    * Interpreted program instruction:
  591.    *
  592.    * For scanning transactions, 
  593.    * return this row, but no more from this fragment
  594.    *
  595.    * For non-scanning transactions,
  596.    * abort the whole transaction.
  597.    *
  598.    * @return            -1 if unsuccessful.
  599.    */
  600.   int interpret_exit_last_row();
  601.   
  602.   /**
  603.    * Interpreted program instruction:
  604.    * Define a subroutine in an interpreted operation.
  605.    *
  606.    * @param SubroutineNumber the subroutine number.
  607.    * @return -1 if unsuccessful.
  608.    */
  609.   int   def_subroutine(int SubroutineNumber);
  610.   /**
  611.    * Interpreted program instruction:
  612.    * Call a subroutine.
  613.    *
  614.    * @param Subroutine the subroutine to call.
  615.    * @return -1 if unsuccessful. 
  616.    */
  617.   int   call_sub(Uint32 Subroutine);
  618.   /**
  619.    * Interpreted program instruction:
  620.    * End a subroutine.
  621.    *
  622.    * @return -1 if unsuccessful. 
  623.    */
  624.   int   ret_sub();
  625.   /** @} *********************************************************************/
  626.   /** 
  627.    * @name Error Handling
  628.    * @{
  629.    */
  630.   /**
  631.    * Get the latest error code.
  632.    *
  633.    * @return error code.
  634.    */
  635.   const NdbError & getNdbError() const;
  636.   /**
  637.    * Get the method number where the error occured.
  638.    * 
  639.    * @return method number where the error occured.
  640.    */
  641.   int getNdbErrorLine();
  642.   /**
  643.    * Get table name of this operation.
  644.    */
  645.   const char* getTableName() const;
  646.   /** @} *********************************************************************/
  647.   /**
  648.    * Type of operation
  649.    */
  650.   enum OperationType { 
  651.     ReadRequest = 0,              ///< Read operation
  652.     UpdateRequest = 1,            ///< Update Operation
  653.     InsertRequest = 2,            ///< Insert Operation
  654.     DeleteRequest = 3,            ///< Delete Operation
  655.     WriteRequest = 4,             ///< Write Operation
  656.     ReadExclusive = 5,            ///< Read exclusive
  657.     OpenScanRequest,              ///< Scan Operation
  658.     OpenRangeScanRequest,         ///< Range scan operation
  659.     NotDefined2,                  ///< Internal for debugging
  660.     NotDefined                    ///< Internal for debugging
  661.   };
  662.   LockMode getLockMode() const { return theLockMode; }
  663. protected:
  664. /******************************************************************************
  665.  * These are the methods used to create and delete the NdbOperation objects.
  666.  *****************************************************************************/
  667.   bool                  needReply();
  668. /******************************************************************************
  669.  * These methods are service routines used by the other NDB API classes.
  670.  *****************************************************************************/
  671. //--------------------------------------------------------------
  672. // Initialise after allocating operation to a transaction       
  673. //--------------------------------------------------------------
  674.   int init(const class NdbTableImpl*, NdbConnection* aCon);
  675.   void initInterpreter();
  676.   NdbOperation(Ndb* aNdb);
  677.   virtual ~NdbOperation();
  678.   void next(NdbOperation*); // Set next pointer       
  679.   NdbOperation*     next();         // Get next pointer        
  680.   enum OperationStatus{ 
  681.     Init,                       
  682.     OperationDefined,
  683.     TupleKeyDefined,
  684.     GetValue,
  685.     SetValue,
  686.     ExecInterpretedValue,
  687.     SetValueInterpreted,
  688.     FinalGetValue,
  689.     SubroutineExec,
  690.     SubroutineEnd,
  691.     WaitResponse,
  692.     WaitCommitResponse,
  693.     Finished,
  694.     ReceiveFinished
  695.   };
  696.   OperationStatus   Status();           // Read the status information
  697.   
  698.   void     Status(OperationStatus);    // Set the status information
  699.   void     NdbCon(NdbConnection*); // Set reference to connection
  700.    // object.
  701.   virtual void     release(); // Release all operations 
  702.                                                 // connected to
  703.        // the operations object.      
  704.   void     setStartIndicator();
  705. /******************************************************************************
  706.  * The methods below is the execution part of the NdbOperation
  707.  * class. This is where the NDB signals are sent and received. The
  708.  * operation can send TC[KEY/INDX]REQ, [INDX]ATTRINFO. 
  709.  * It can receive TC[KEY/INDX]CONF, TC[KEY/INDX]REF, [INDX]ATTRINFO. 
  710.  * When an operation is received in its fulness or a refuse message 
  711.  * was sent, then the connection object is told about this situation.
  712.  *****************************************************************************/
  713.   int    doSend(int ProcessorId, Uint32 lastFlag);
  714.   virtual int  prepareSend(Uint32  TC_ConnectPtr,
  715.                              Uint64  TransactionId);
  716.   virtual void   setLastFlag(NdbApiSignal* signal, Uint32 lastFlag);
  717.     
  718.   int  prepareSendInterpreted();            // Help routine to prepare*
  719.    
  720.   int  receiveTCKEYREF(NdbApiSignal*); 
  721.   int  checkMagicNumber(bool b = true); // Verify correct object
  722.   int    checkState_TransId(NdbApiSignal* aSignal);
  723. /******************************************************************************
  724.  * These are support methods only used locally in this class.
  725. ******************************************************************************/
  726.   virtual int equal_impl(const NdbColumnImpl*,const char* aValue, Uint32 len);
  727.   virtual NdbRecAttr* getValue_impl(const NdbColumnImpl*, char* aValue = 0);
  728.   int setValue(const NdbColumnImpl* anAttrObject, const char* aValue, Uint32 len);
  729.   NdbBlob* getBlobHandle(NdbConnection* aCon, const NdbColumnImpl* anAttrObject);
  730.   int incValue(const NdbColumnImpl* anAttrObject, Uint32 aValue);
  731.   int incValue(const NdbColumnImpl* anAttrObject, Uint64 aValue);
  732.   int subValue(const NdbColumnImpl* anAttrObject, Uint32 aValue);
  733.   int subValue(const NdbColumnImpl* anAttrObject, Uint64 aValue);
  734.   int read_attr(const NdbColumnImpl* anAttrObject, Uint32 RegDest);
  735.   int write_attr(const NdbColumnImpl* anAttrObject, Uint32 RegSource);
  736.   int branch_reg_reg(Uint32 type, Uint32, Uint32, Uint32);
  737.   int branch_col(Uint32 type, Uint32, const char *, Uint32, bool, Uint32 Label);
  738.   int branch_col_null(Uint32 type, Uint32 col, Uint32 Label);
  739.   
  740.   // Handle ATTRINFO signals   
  741.   int        insertATTRINFO(Uint32 aData);
  742.   int         insertATTRINFOloop(const Uint32* aDataPtr, Uint32 aLength);
  743.   int        insertKEYINFO(const char* aValue,
  744.     Uint32 aStartPosition,
  745.     Uint32 aKeyLenInByte,
  746.     Uint32 anAttrBitsInLastWord);
  747.   
  748.   virtual void setErrorCode(int aErrorCode);
  749.   virtual void setErrorCodeAbort(int aErrorCode);
  750.   void        handleFailedAI_ElemLen();    // When not all attribute data
  751.                                            // were received
  752.   int       incCheck(const NdbColumnImpl* anAttrObject);
  753.   int       initial_interpreterCheck();
  754.   int       intermediate_interpreterCheck();
  755.   int       read_attrCheck(const NdbColumnImpl* anAttrObject);
  756.   int       write_attrCheck(const NdbColumnImpl* anAttrObject);
  757.   int       labelCheck();
  758.   int       insertCall(Uint32 aCall);
  759.   int       insertBranch(Uint32 aBranch);
  760.   Uint32 ptr2int() { return theReceiver.getId(); };
  761.   // get table or index key from prepared signals
  762.   int getKeyFromTCREQ(Uint32* data, unsigned size);
  763. /******************************************************************************
  764.  * These are the private variables that are defined in the operation objects.
  765.  *****************************************************************************/
  766.   NdbReceiver theReceiver;
  767.   NdbError theError; // Errorcode        
  768.   int     theErrorLine; // Error line       
  769.   Ndb*    theNdb;        // Point back to the Ndb object.
  770.   NdbConnection*   theNdbCon;         // Point back to the connection object.
  771.   NdbOperation*    theNext;         // Next pointer to operation.
  772.   NdbApiSignal*    theTCREQ; // The TC[KEY/INDX]REQ signal object
  773.   NdbApiSignal*    theFirstATTRINFO; // The first ATTRINFO signal object 
  774.   NdbApiSignal*    theCurrentATTRINFO; // The current ATTRINFO signal object  
  775.   Uint32    theTotalCurrAI_Len; // The total number of attribute info
  776.           // words currently defined    
  777.   Uint32    theAI_LenInCurrAI; // The number of words defined in the
  778.              // current ATTRINFO signal
  779.   NdbApiSignal*    theFirstKEYINFO; // The first KEYINFO signal object 
  780.   NdbApiSignal*    theLastKEYINFO; // The first KEYINFO signal object 
  781.   class NdbLabel*     theFirstLabel;
  782.   class NdbLabel*     theLastLabel;
  783.   class NdbBranch*     theFirstBranch;
  784.   class NdbBranch*     theLastBranch;
  785.   class NdbCall*     theFirstCall;
  786.   class NdbCall*     theLastCall;
  787.   class NdbSubroutine*    theFirstSubroutine;
  788.   class NdbSubroutine*    theLastSubroutine;
  789.   Uint32     theNoOfLabels;
  790.   Uint32     theNoOfSubroutines;
  791.   Uint32*           theKEYINFOptr;       // Pointer to where to write KEYINFO
  792.   Uint32*           theATTRINFOptr;      // Pointer to where to write ATTRINFO
  793.   const class NdbTableImpl* m_currentTable;      // The current table
  794.   const class NdbTableImpl* m_accessTable;
  795.   // Set to TRUE when a tuple key attribute has been defined. 
  796.   Uint32     theTupleKeyDefined[NDB_MAX_NO_OF_ATTRIBUTES_IN_KEY][3];
  797.   Uint32     theTotalNrOfKeyWordInSignal;     // The total number of
  798.         // keyword in signal.
  799.   Uint32     theTupKeyLen;    // Length of the tuple key in words
  800.   Uint32     theNoOfTupKeyDefined;  // The number of tuple key attributes
  801.            // currently defined   
  802.   OperationType   theOperationType;        // Read Request, Update Req......   
  803.   LockMode        theLockMode;    // Can be set to WRITE if read operation 
  804.   OperationStatus theStatus;    // The status of the operation.
  805.   Uint32         theMagicNumber;  // Magic number to verify that object 
  806.                                    // is correct
  807.   Uint32 theScanInfo;          // Scan info bits (take over flag etc)
  808.   Uint32 theDistrKeySize;         // Distribution Key size if used
  809.   Uint32 theDistributionGroup;    // Distribution Group if used
  810.   Uint32 theSubroutineSize;    // Size of subroutines for interpretation
  811.   Uint32 theInitialReadSize;    // Size of initial reads for interpretation
  812.   Uint32 theInterpretedSize;    // Size of interpretation
  813.   Uint32 theFinalUpdateSize;    // Size of final updates for interpretation
  814.   Uint32 theFinalReadSize;    // Size of final reads for interpretation
  815.   Uint8  theStartIndicator;    // Indicator of whether start operation
  816.   Uint8  theCommitIndicator;    // Indicator of whether commit operation
  817.   Uint8  theSimpleIndicator;    // Indicator of whether simple operation
  818.   Uint8  theDirtyIndicator;    // Indicator of whether dirty operation
  819.   Uint8  theInterpretIndicator;   // Indicator of whether interpreted operation
  820.   Uint8  theDistrGroupIndicator;  // Indicates whether distribution grp is used
  821.   Uint8  theDistrGroupType;       // Type of distribution group used
  822.   Uint8  theDistrKeyIndicator;    // Indicates whether distr. key is used
  823.   Uint16 m_tcReqGSN;
  824.   Uint16 m_keyInfoGSN;
  825.   Uint16 m_attrInfoGSN;
  826.   // Blobs in this operation
  827.   NdbBlob* theBlobList;
  828.   /*
  829.    * Abort option per operation, used by blobs.  Default -1.  If set,
  830.    * overrides abort option on connection level.  If set to IgnoreError,
  831.    * does not cause execute() to return failure.  This is different from
  832.    * IgnoreError on connection level.
  833.    */
  834.   Int8 m_abortOption;
  835.   friend struct Ndb_free_list_t<NdbOperation>;
  836. };
  837. #ifdef NDB_NO_DROPPED_SIGNAL
  838. #include <stdlib.h>
  839. #endif
  840. inline
  841. int
  842. NdbOperation::checkMagicNumber(bool b)
  843. {
  844.   if (theMagicNumber != 0xABCDEF01){
  845. #ifdef NDB_NO_DROPPED_SIGNAL
  846.     if(b) abort();
  847. #endif
  848.     return -1;
  849.   }
  850.   return 0;
  851. }
  852. inline
  853. void
  854. NdbOperation::setStartIndicator()
  855. {
  856.   theStartIndicator = 1;
  857. }
  858. inline
  859. int
  860. NdbOperation::getNdbErrorLine()
  861. {
  862.   return theErrorLine;
  863. }
  864. /******************************************************************************
  865. void next(NdbOperation* aNdbOperation);
  866. Parameters:    aNdbOperation: Pointers to the NdbOperation object.
  867. Remark:        Set the next variable of the operation object.
  868. ******************************************************************************/
  869. inline
  870. void
  871. NdbOperation::next(NdbOperation* aNdbOperation)
  872. {
  873.   theNext = aNdbOperation;
  874. }
  875. /******************************************************************************
  876. NdbOperation* next();
  877. Return Value:   Return  next pointer to NdbOperation object.
  878. Remark:         Get the next variable of the operation object.
  879. ******************************************************************************/
  880. inline
  881. NdbOperation*
  882. NdbOperation::next()
  883. {
  884.   return theNext;
  885. }
  886. /******************************************************************************
  887. OperationStatus  Status();
  888. Return Value    Return the OperationStatus.
  889. Parameters:     aStatus:  The status.
  890. Remark:         Sets Operation status. 
  891. ******************************************************************************/
  892. inline
  893. NdbOperation::OperationStatus
  894. NdbOperation::Status()
  895. {
  896.   return theStatus;
  897. }
  898. /******************************************************************************
  899. void  Status(OperationStatus aStatus);
  900. Parameters:     aStatus: The status.
  901. Remark:         Sets Operation
  902.  status. 
  903. ******************************************************************************/
  904. inline
  905. void
  906. NdbOperation::Status( OperationStatus aStatus )
  907. {
  908.   theStatus = aStatus;
  909. }
  910. /******************************************************************************
  911. void NdbCon(NdbConnection* aNdbCon);
  912. Parameters:    aNdbCon: Pointers to NdbConnection object.
  913. Remark:        Set the reference to the connection in the operation object.
  914. ******************************************************************************/
  915. inline
  916. void
  917. NdbOperation::NdbCon(NdbConnection* aNdbCon)
  918. {
  919.   theNdbCon = aNdbCon;
  920. }
  921. inline
  922. int
  923. NdbOperation::equal(const char* anAttrName, Int32 aPar)
  924. {
  925.   return equal(anAttrName, (const char*)&aPar, (Uint32)4);
  926. }
  927. inline
  928. int
  929. NdbOperation::equal(const char* anAttrName, Uint32 aPar)
  930. {
  931.   return equal(anAttrName, (const char*)&aPar, (Uint32)4);
  932. }
  933. inline
  934. int
  935. NdbOperation::equal(const char* anAttrName, Int64 aPar)
  936. {
  937.   return equal(anAttrName, (const char*)&aPar, (Uint32)8);
  938. }
  939. inline
  940. int
  941. NdbOperation::equal(const char* anAttrName, Uint64 aPar)
  942. {
  943.   return equal(anAttrName, (const char*)&aPar, (Uint32)8);
  944. }
  945. inline
  946. int
  947. NdbOperation::equal(Uint32 anAttrId, Int32 aPar)
  948. {
  949.   return equal(anAttrId, (const char*)&aPar, (Uint32)4);
  950. }
  951. inline
  952. int
  953. NdbOperation::equal(Uint32 anAttrId, Uint32 aPar)
  954. {
  955.   return equal(anAttrId, (const char*)&aPar, (Uint32)4);
  956. }
  957. inline
  958. int
  959. NdbOperation::equal(Uint32 anAttrId, Int64 aPar)
  960. {
  961.   return equal(anAttrId, (const char*)&aPar, (Uint32)8);
  962. }
  963. inline
  964. int
  965. NdbOperation::equal(Uint32 anAttrId, Uint64 aPar)
  966. {
  967.   return equal(anAttrId, (const char*)&aPar, (Uint32)8);
  968. }
  969. inline
  970. int
  971. NdbOperation::setValue(const char* anAttrName, Int32 aPar)
  972. {
  973.   return setValue(anAttrName, (const char*)&aPar, (Uint32)4);
  974. }
  975. inline
  976. int
  977. NdbOperation::setValue(const char* anAttrName, Uint32 aPar)
  978. {
  979.   return setValue(anAttrName, (const char*)&aPar, (Uint32)4);
  980. }
  981. inline
  982. int
  983. NdbOperation::setValue(const char* anAttrName, Int64 aPar)
  984. {
  985.   return setValue(anAttrName, (const char*)&aPar, (Uint32)8);
  986. }
  987. inline
  988. int
  989. NdbOperation::setValue(const char* anAttrName, Uint64 aPar)
  990. {
  991.   return setValue(anAttrName, (const char*)&aPar, (Uint32)8);
  992. }
  993. inline
  994. int
  995. NdbOperation::setValue(const char* anAttrName, float aPar)
  996. {
  997.   return setValue(anAttrName, (const char*)&aPar, (Uint32)4);
  998. }
  999. inline
  1000. int
  1001. NdbOperation::setValue(const char* anAttrName, double aPar)
  1002. {
  1003.   return setValue(anAttrName, (const char*)&aPar, (Uint32)8);
  1004. }
  1005. inline
  1006. int
  1007. NdbOperation::setValue(Uint32 anAttrId, Int32 aPar)
  1008. {
  1009.   return setValue(anAttrId, (const char*)&aPar, (Uint32)4);
  1010. }
  1011. inline
  1012. int
  1013. NdbOperation::setValue(Uint32 anAttrId, Uint32 aPar)
  1014. {
  1015.   return setValue(anAttrId, (const char*)&aPar, (Uint32)4);
  1016. }
  1017. inline
  1018. int
  1019. NdbOperation::setValue(Uint32 anAttrId, Int64 aPar)
  1020. {
  1021.   return setValue(anAttrId, (const char*)&aPar, (Uint32)8);
  1022. }
  1023. inline
  1024. int
  1025. NdbOperation::setValue(Uint32 anAttrId, Uint64 aPar)
  1026. {
  1027.   return setValue(anAttrId, (const char*)&aPar, (Uint32)8);
  1028. }
  1029. inline
  1030. int
  1031. NdbOperation::setValue(Uint32 anAttrId, float aPar)
  1032. {
  1033.   return setValue(anAttrId, (char*)&aPar, (Uint32)4);
  1034. }
  1035. inline
  1036. int
  1037. NdbOperation::setValue(Uint32 anAttrId, double aPar)
  1038. {
  1039.   return setValue(anAttrId, (const char*)&aPar, (Uint32)8);
  1040. }
  1041. #endif