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

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. /* ***************************************************
  14.        TEST OF INTERPRETER IN TUP
  15.        Verify that the interpreter in TUP is able to
  16.        handle and execute all the commands that the
  17.        NdbApi can isssue
  18.        Arguments:
  19.        operationType     1 openScanRead,
  20.                          2 openScanExclusive,
  21.                          3 interpretedUpdateTuple,
  22.                          4 interpretedDirtyUpdate,
  23.                          5 interpretedDeleteTuple
  24.                          6 deleteTuple
  25.                          7 insertTuple
  26.                          8 updateTuple
  27.                          9 writeTuple
  28.                          10 readTuple
  29.                          11 readTupleExclusive
  30.                          12 simpleRead
  31.                          13 dirtyRead
  32.                          14 dirtyUpdate
  33.                          15 dirtyWrite
  34.        tupTest           1 exitMethods
  35.                          2 incValue
  36.                          3 subValue
  37.                          4 readAttr
  38.                          5 writeAttr
  39.                          6 loadConst
  40.                          7 branch
  41.                          8 branchIfNull
  42.                          9 addReg
  43.                          10 subReg
  44.                          11 subroutineWithBranchLabel
  45.         scanTest         Number of the test within each tupTest
  46. * *************************************************** */
  47. #include <NdbOut.hpp>
  48. #include <NdbThread.h>
  49. #include <NdbMutex.h>
  50. #include <NdbApi.hpp>
  51. #include <NdbSchemaCon.hpp>
  52. #include <NDBT.hpp>
  53. #define MAXATTR 3
  54. #define MAXTABLES 12
  55. #define MAXSTRLEN 8
  56. #define NUMBEROFRECORDS 1000
  57. typedef enum {
  58.     FAIL = 0,
  59.     NO_FAIL,
  60. UNDEF
  61. } TTYPE;
  62. inline void  setAttrNames() ;
  63. inline void  setTableNames() ;
  64. void  error_handler(const NdbError & err, TTYPE);
  65. void  create_table(Ndb*);
  66. void  write_rows(Ndb*);
  67. void  update_rows(Ndb*, int, int);
  68. void  delete_rows(Ndb*, int, int);
  69. void  verify_deleted(Ndb*);
  70. void  read_and_verify_rows(Ndb*, bool pre);
  71. void  scan_rows(Ndb*, int, int, int);
  72. TTYPE t_exitMethods(int, NdbOperation*, int);
  73. TTYPE t_incValue(int, NdbOperation*);
  74. TTYPE t_subValue(int, NdbOperation*);
  75. TTYPE t_readAttr(int, NdbOperation*);
  76. TTYPE t_writeAttr(int, NdbOperation*);
  77. TTYPE t_loadConst(int, NdbOperation*, int);
  78. TTYPE t_branch(int, NdbOperation*);
  79. TTYPE t_branchIfNull(int, NdbOperation*);
  80. TTYPE t_addReg(int, NdbOperation*);
  81. TTYPE t_subReg(int, NdbOperation*);
  82. TTYPE t_subroutineWithBranchLabel(int, NdbOperation*);
  83. char        tableName[MAXSTRLEN+1];
  84. char        attrName[MAXATTR][MAXSTRLEN+1];
  85. int         attrValue[NUMBEROFRECORDS] = {0};
  86. int         pkValue[NUMBEROFRECORDS] = {0};
  87. const int   tAttributeSize = 1 ;
  88. const int   nRecords = 20 ;
  89. int         bTestPassed = 0;
  90.   
  91. int main(int argc, const char** argv) {
  92.   ndb_init();
  93.   int operationType = 0;
  94.   int tupTest = 0;
  95.   int scanTest = 0;
  96.   Ndb* pNdb = new Ndb("TEST_DB");
  97.   pNdb->init();
  98.   if (argc != 4  ||  sscanf(argv[1],"%d", &operationType) != 1) {
  99.     operationType = 1 ;
  100.   }
  101.   if (argc != 4  ||  sscanf(argv[2],"%d", &tupTest) != 1) {
  102.     tupTest = 1 ;
  103.   }
  104.   if (argc != 4  ||  sscanf(argv[3],"%d", &scanTest) != 1) {
  105.     scanTest = 1 ;
  106.   }
  107.   ndbout << endl
  108.       << "Test the interpreter in TUP using SimpleTable withn"
  109.       << nRecords << " records" << endl << endl ;
  110.   if (pNdb->waitUntilReady(30) != 0) {
  111.     ndbout << "NDB is not ready" << endl;
  112.     return -1;
  113.   }
  114.   // Init the pk and attr values.
  115.   for (int i = 0; i < NUMBEROFRECORDS; i ++)
  116.     pkValue[i] = attrValue[i] = i ;
  117.   setAttrNames() ;
  118.   setTableNames() ;
  119.   
  120.   const void * p = NDBT_Table::discoverTableFromDb(pNdb, tableName);
  121.   if (p != 0){
  122.     create_table(pNdb);
  123.   }
  124.   
  125.   write_rows(pNdb);
  126.   ndbout << endl << "Starting interpreter in TUP test." << endl << "Operation type: " ;
  127.   switch(operationType) {
  128.   case 1:
  129.     ndbout << "openScanRead" << endl;
  130.     scan_rows(pNdb,  operationType,  tupTest,  scanTest);
  131.     break;
  132.   case 2:
  133.     ndbout << "openScanExclusive" << endl;
  134.     scan_rows(pNdb,  operationType,  tupTest,  scanTest);
  135.     break;
  136.   case 3:
  137.     ndbout << "interpretedUpdateTuple" << endl;
  138.     update_rows(pNdb,  tupTest,  operationType);
  139.     break;
  140.   case 4:
  141.     ndbout << "interpretedDirtyUpdate" << endl;
  142.     update_rows(pNdb,  tupTest,  operationType);
  143.     break;
  144.   case 5:
  145.     ndbout << "interpretedDeleteTuple" << endl;
  146.     delete_rows(pNdb,  tupTest,  operationType);
  147.     break;
  148.   case 6:
  149.     ndbout << "deleteTuple" << endl;
  150.     break;
  151.   case 7:
  152.     ndbout << "insertTuple" << endl;
  153.     break;
  154.   case 8:
  155.     ndbout << "updateTuple" << endl;
  156.     break;
  157.   case 9:
  158.     ndbout << "writeTuple" << endl;
  159.     break;
  160.   case 10:
  161.     ndbout << "readTuple" << endl;
  162.     break;
  163.   case 11:
  164.     ndbout << "readTupleExclusive" << endl;
  165.     break;
  166.   case 12:
  167.     ndbout << "simpleRead" << endl;
  168.     break;
  169.   case 13:
  170.     ndbout << "dirtyRead" << endl;
  171.     break;
  172.   case 14:
  173.     ndbout << "dirtyUpdate" << endl;
  174.     break;
  175.   case 15:
  176.     ndbout << "dirtyWrite" << endl;
  177.     break;
  178.   default:
  179.     break ;
  180.   }
  181. //  read_and_verify_rows(pNdb, false);
  182. //  delete_rows(pNdb, 0, 0) ;
  183.   delete pNdb ;
  184.   if (bTestPassed == 0) {
  185.       ndbout << "OK: test passed" << endl;
  186.       exit(0);
  187.   }else{
  188.       ndbout << "FAIL: test failed" << endl;
  189.       exit(-1);
  190.   }
  191. }
  192. void error_handler(const NdbError & err, TTYPE type_expected) {
  193.   ndbout << err << endl ;
  194.   switch (type_expected){
  195.       case NO_FAIL:
  196.           bTestPassed = -1 ;
  197.           break ;
  198.       case FAIL:
  199.           ndbout << "OK: error is expected" << endl;
  200.           break ;
  201.       case UNDEF:
  202.           ndbout << "assumed OK: expected result undefined" << endl ;
  203.           break ;
  204.       default:
  205.           break ;
  206.   }
  207. }
  208. void  create_table(Ndb* pMyNdb) {
  209.   /****************************************************************
  210.    *    Create SimpleTable and Attributes.
  211.    *
  212.    *    create table SimpleTable1(
  213.    *        col0 int,
  214.    *        col1 int not null,
  215.    *        col2 int not null,
  216.    *        col3 int not null ... 129)
  217.    *
  218.    ***************************************************************/
  219.   int               check = -1 ;
  220.   NdbSchemaOp       *MySchemaOp = NULL ;
  221.   ndbout << endl << "Creating " << tableName << " ... " << endl;
  222.    NdbSchemaCon* MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pMyNdb);
  223.    if(!MySchemaTransaction) error_handler(MySchemaTransaction->getNdbError(), NO_FAIL);
  224.    
  225.    MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  226.    if( !MySchemaOp ) error_handler(MySchemaTransaction->getNdbError(), NO_FAIL);
  227.    // Create table
  228.    check = MySchemaOp->createTable( tableName,
  229.                                      8,         // Table size
  230.                                      TupleKey,  // Key Type
  231.                                      40         // Nr of Pages
  232.                                    );
  233.    if( check == -1 ) error_handler(MySchemaTransaction->getNdbError(), NO_FAIL);
  234.    ndbout << "Creating attributes ... " << flush;
  235.    // Create first column, primary key
  236.    check = MySchemaOp->createAttribute( attrName[0],
  237.                                         TupleKey,
  238.                                         32,
  239.                                         1/*3, tAttributeSize */,
  240.                                         UnSigned,
  241.                                         MMBased,
  242.                                         NotNullAttribute );
  243.    if( check == -1 ) error_handler(MySchemaTransaction->getNdbError(), NO_FAIL);
  244.    // create the 2 .. n columns.
  245.    for ( int i = 1; i < MAXATTR; i++ ){
  246.        check = MySchemaOp->createAttribute( attrName[i],
  247.                                             NoKey,
  248.                                             32,
  249.                                             tAttributeSize,
  250.                                             UnSigned,
  251.                                             MMBased,
  252.                                             NotNullAttribute );
  253.       if( check == -1 ) error_handler(MySchemaTransaction->getNdbError(), NO_FAIL);
  254.    }
  255.    ndbout << "OK" << endl;
  256.    if( MySchemaTransaction->execute() == -1 ) {
  257.        ndbout << MySchemaTransaction->getNdbError() << endl;
  258.    }else{
  259.        ndbout << tableName[0] << " created" << endl;
  260.    }
  261.    NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  262.    return;
  263. }
  264. void write_rows (Ndb* pMyNdb) {
  265.   /****************************************************************
  266.    *    Insert rows into SimpleTable
  267.    *
  268.    ***************************************************************/
  269.   int check = -1 ;
  270.   int loop_count_ops = nRecords ;
  271.   NdbOperation      *MyOperation = NULL ;
  272.   NdbConnection     *MyTransaction = NULL ;
  273.   ndbout << endl << "Writing records ..."  << flush;
  274.   for (int count=0 ; count < loop_count_ops ; count++){
  275.       MyTransaction = pMyNdb->startTransaction();
  276.       if (!MyTransaction) {
  277.           error_handler(pMyNdb->getNdbError(), NO_FAIL);
  278.       }//if
  279.       MyOperation = MyTransaction->getNdbOperation(tableName);
  280.       if (!MyOperation) {
  281.         error_handler(pMyNdb->getNdbError(), NO_FAIL);
  282.       }//if
  283.       check = MyOperation->writeTuple();
  284.       if( check == -1 ) error_handler(MyTransaction->getNdbError(), NO_FAIL);
  285.       check = MyOperation->equal( attrName[0],(char*)&pkValue[count] );
  286.       if( check == -1 ) error_handler(MyTransaction->getNdbError(), NO_FAIL);
  287.       // Update the columns, index column already ok.
  288.       for (int i = 1 ; i < MAXATTR; i++){
  289.           if ((i == 2) && (count > 4)){
  290.               check = MyOperation->setValue(attrName[i], (char*)&attrValue[count + 1]);
  291.           }else{
  292.               check = MyOperation->setValue(attrName[i], (char*)&attrValue[count]);
  293.           }
  294.         if( check == -1 ) error_handler(MyTransaction->getNdbError(), NO_FAIL);
  295.       }
  296.       check = MyTransaction->execute( Commit );
  297.       if(check == -1 ) error_handler(MyTransaction->getNdbError(), NO_FAIL);
  298.       
  299.       pMyNdb->closeTransaction(MyTransaction);
  300.     }
  301.    ndbout <<" tOK" << endl;
  302.    return;
  303. }
  304. void verify_deleted(Ndb* pMyNdb) {
  305.   int               check = -1 ;
  306.   int               loop_count_ops = nRecords;
  307.   NdbOperation*     pMyOperation = NULL ;
  308.   ndbout << "Verifying deleted records..."<< flush;
  309.   for (int count=0 ; count < loop_count_ops ; count++){
  310.       NdbConnection*  pMyTransaction = pMyNdb->startTransaction();
  311.       if (!pMyTransaction) error_handler(pMyNdb->getNdbError(), NO_FAIL);
  312.       
  313.       pMyOperation = pMyTransaction->getNdbOperation(tableName);
  314.       if (!pMyOperation) error_handler(pMyNdb->getNdbError(), NO_FAIL);
  315.       
  316.       check = pMyOperation->readTuple();
  317.       if( check == -1 ) error_handler( pMyTransaction->getNdbError(), NO_FAIL);
  318.       check = pMyOperation->equal( attrName[0],(char*)&pkValue[count] );
  319.       if( check == -1 ) error_handler( pMyTransaction->getNdbError(), NO_FAIL);
  320.      // Exepect to receive an error
  321.      if(pMyTransaction->execute(Commit) != -1)
  322.          if( 626 == pMyTransaction->getNdbError().code){
  323.              ndbout << pMyTransaction->getNdbError() << endl ;
  324.              ndbout << "OK" << endl ;
  325.          }else{
  326.              error_handler(pMyTransaction->getNdbError(), NO_FAIL) ;
  327.          }
  328.      pMyNdb->closeTransaction(pMyTransaction);
  329.     }
  330.   ndbout << "OK" << endl;
  331.   return;
  332. };
  333. void read_and_verify_rows(Ndb* pMyNdb, bool pre) {
  334.   int               check = -1 ;
  335.   int               loop_count_ops = nRecords;
  336.   char              expectedCOL1[NUMBEROFRECORDS] = {0} ;
  337.   char              expectedCOL2[NUMBEROFRECORDS] = {0} ;
  338.   NdbConnection     *pMyTransaction = NULL ;
  339.   NdbOperation      *MyOp = NULL ;
  340.   NdbRecAttr*       tTmp = NULL ;
  341.   int               readValue[MAXATTR] = {0} ;
  342.   ndbout << "Verifying records...n"<< endl;
  343.   for (int count=0 ; count < loop_count_ops ; count++){
  344.       
  345.       pMyTransaction = pMyNdb->startTransaction();
  346.       if (!pMyTransaction) error_handler(pMyNdb->getNdbError(), NO_FAIL);
  347.       MyOp = pMyTransaction->getNdbOperation(tableName);
  348.       if (!MyOp) error_handler( pMyTransaction->getNdbError(), NO_FAIL);
  349.       check = MyOp->readTuple();
  350.       if( check == -1 ) error_handler( MyOp->getNdbError(), NO_FAIL);
  351.       
  352.       check = MyOp->equal( attrName[0],(char*)&pkValue[count] );
  353.       if( check == -1 ) error_handler( MyOp->getNdbError(), NO_FAIL);
  354.       for (int count_attributes = 1; count_attributes < MAXATTR; count_attributes++){
  355.           
  356.           tTmp = MyOp->getValue( (char*)attrName[count_attributes], (char*)&readValue[count_attributes] );
  357.           if(!tTmp) error_handler( MyOp->getNdbError(), NO_FAIL);
  358.       }
  359.       if( pMyTransaction->execute( Commit ) == -1 ) {
  360.          error_handler(pMyTransaction->getNdbError(), NO_FAIL);
  361.       } else {
  362.         if (pre) {
  363.           expectedCOL1[count] = readValue[1];
  364.           expectedCOL2[count] = readValue[2];
  365.         }
  366.         
  367.         ndbout << attrName[1] << "t " << readValue[1] << "t "
  368.              << attrName[2] << "t " << readValue[2] << endl;
  369.       }
  370.       pMyNdb->closeTransaction(pMyTransaction);
  371.   }
  372.   ndbout << "nOKn" << endl;
  373.   return;
  374. };
  375. TTYPE t_exitMethods(int nCalls, NdbOperation * pOp, int opType) {
  376.   ndbout << "Defining exitMethods test " << nCalls << ": " << endl ;;
  377.   TTYPE ret_val = NO_FAIL ;
  378.   switch(nCalls){
  379.   case 1: // exit_nok if attr value matches
  380.     pOp->read_attr("COL1", 1);
  381.     pOp->load_const_u32(2, 14);
  382.     pOp->branch_eq(1, 2, 0);
  383.     pOp->interpret_exit_ok() ;
  384.     pOp->def_label(0);
  385.     pOp->interpret_exit_nok();
  386.     break;
  387.   case 2: // exit_ok if attr value doesn't match
  388.     pOp->read_attr("COL1", 1);
  389.     pOp->load_const_u32(2, 14);
  390.     pOp->branch_eq(1, 2, 0);
  391.     pOp->interpret_exit_nok() ;
  392.     pOp->def_label(0);
  393.     if (opType == 3) {
  394.       // For update transactions use incValue to update the tuple
  395.       Uint32 val32 = 5;
  396.       pOp->incValue("COL2", val32);
  397.     }
  398.     pOp->interpret_exit_ok();
  399.     break ;
  400.   case 3: // Non-existent value (128): exit_ok if if the value matches
  401.     pOp->read_attr("COL1", 1);
  402.     pOp->load_const_u32(2, 128);
  403.     pOp->branch_eq(1, 2, 0);
  404.     pOp->interpret_exit_nok();
  405.     pOp->def_label(0);
  406.     pOp->interpret_exit_ok();
  407. ret_val = FAIL ;
  408.     break;
  409.   case 4: // Non-existent value (128): exit_nok if the value matches
  410.     pOp->read_attr("COL1", 1);
  411.     pOp->load_const_u32(2, 128);
  412.     pOp->branch_eq(1, 2, 0);
  413.     pOp->interpret_exit_ok();
  414.     pOp->def_label(0);
  415.     pOp->interpret_exit_nok();
  416. ret_val = FAIL ;
  417.     break;
  418.   case 5: // exit_nok of the value matches
  419.     pOp->read_attr("COL1", 1);
  420.     pOp->load_const_u32(2, 2);
  421.     pOp->branch_eq(1, 2, 0);
  422.     pOp->interpret_exit_ok();
  423.     pOp->def_label(0);
  424.     pOp->interpret_exit_nok();
  425.     break ;
  426.   case 6: // exit_ok of the value matches
  427.     pOp->read_attr("COL1", 1);
  428.     pOp->load_const_u32(2, 2);
  429.     pOp->branch_eq(1, 2, 0);
  430.     pOp->interpret_exit_nok();
  431.     pOp->def_label(0);
  432.     if (opType == 3) {
  433.       // For update transactions use incValue to update the tuple
  434.       Uint32 val32 = 5;
  435.       pOp->incValue("COL2", val32);
  436.     }
  437.     pOp->interpret_exit_ok();
  438.     break;
  439.   case 7: // exit_nok if the value matches
  440.     pOp->read_attr("COL1", 1);
  441.     pOp->load_const_u32(2, 6);
  442.     pOp->branch_eq(1, 2, 0);
  443.     pOp->interpret_exit_ok();
  444.     pOp->def_label(0);
  445.     pOp->interpret_exit_nok();
  446.     break;
  447.   case 8: // exit_ok if the value matches
  448.     pOp->read_attr("COL1", 1);
  449.     pOp->load_const_u32(2, 6);
  450.     pOp->branch_ne(1, 2, 0);
  451.     pOp->interpret_exit_nok();
  452.     pOp->def_label(0);
  453.     if (opType == 3) {
  454.       // For update transactions use incValue to update the tuple
  455.       Uint32 val32 = 5;
  456.       pOp->incValue("COL2", val32);
  457.     }
  458.     pOp->interpret_exit_ok();
  459.     break ;
  460.   case 9: // exit_nok if the value matches
  461.     pOp->read_attr("COL1", 1);
  462.     pOp->load_const_u32(2, 8);
  463.     pOp->branch_eq(1, 2, 0);
  464.     pOp->interpret_exit_ok();
  465.     pOp->def_label(0);
  466.     pOp->interpret_exit_nok();
  467.     break;
  468.   case 10: // exit_ok if the value matches
  469.     pOp->read_attr("COL1", 1);
  470.     pOp->load_const_u32(2, 8);
  471.     pOp->branch_eq(1, 2, 0);
  472.     pOp->interpret_exit_nok();
  473.     pOp->def_label(0);
  474.     if (opType == 3) {
  475.       // For update transactions use incValue to update the tuple
  476.       Uint32 val32 = 5;
  477.       pOp->incValue("COL2", val32);
  478.     }
  479.     pOp->interpret_exit_ok();
  480.     break;
  481.   case 11: // exit_nok if the value matches
  482.     pOp->read_attr("COL1", 1);
  483.     pOp->load_const_u32(2, 10);
  484.     pOp->branch_eq(1, 2, 0);
  485.     pOp->interpret_exit_ok();
  486.     pOp->def_label(0);
  487.     pOp->interpret_exit_nok();
  488.     break;
  489.   case 12:
  490.     pOp->read_attr("COL1", 1);
  491.     pOp->load_const_u32(2, 10);
  492.     pOp->branch_eq(1, 2, 0);
  493.     pOp->interpret_exit_nok();
  494.     pOp->def_label(0);
  495.     if (opType == 3) {
  496.       // For update transactions use incValue to update the tuple
  497.       Uint32 val32 = 5;
  498.       pOp->incValue("COL2", val32);
  499.     }
  500.     pOp->interpret_exit_ok();
  501.     break;
  502.   case 13:
  503.     pOp->read_attr("COL1", 1);
  504.     pOp->load_const_u32(2, 10);
  505.     pOp->branch_eq(1, 2, 0);
  506.     pOp->interpret_exit_ok();
  507.     pOp->def_label(0);
  508.     pOp->interpret_exit_nok();
  509.     break;
  510.   case 14: // exit_nok if the value matches
  511.     pOp->read_attr("COL1", 1);
  512.     pOp->load_const_u32(2, 12);
  513.     pOp->branch_eq(1, 2, 0);
  514.     pOp->interpret_exit_ok();
  515.     pOp->def_label(0);
  516.     pOp->interpret_exit_nok();
  517.     break;
  518.   case 15: // exit_ok if the value matches
  519.     pOp->read_attr("COL1", 1);
  520.     pOp->load_const_u32(2, 12);
  521.     pOp->branch_eq(1, 2, 0);
  522.     pOp->interpret_exit_nok();
  523.     pOp->def_label(0);
  524.     if (opType == 3) {
  525.       // For update transactions use incValue to update the tuple
  526.       Uint32 val32 = 5;
  527.       pOp->incValue("COL2", val32);
  528.     }
  529.     pOp->interpret_exit_ok();
  530.   case 16:
  531.     pOp->interpret_exit_nok();
  532.     ret_val = FAIL ;
  533.     break;
  534.   case 17:
  535.     pOp->interpret_exit_ok();
  536.     break ;
  537.   case 18:
  538.     pOp->interpret_exit_nok();
  539.     ret_val = FAIL ;
  540.     break ;
  541.   default:
  542.     break ;
  543.   }
  544.   return ret_val;
  545. }
  546. TTYPE t_incValue(int nCalls, NdbOperation* pOp) {
  547.   ndbout << "Defining incValue test " << nCalls << ": ";
  548.   TTYPE ret_val = NO_FAIL;
  549.   Uint32 val32 = 5;
  550.   Uint64 val64 = 5;
  551.   Uint32 attr0 = 0;
  552.   Uint32 attr1 = 1;
  553.   Uint32 attr20 = 20;
  554.   switch(nCalls) {
  555.   case 1:
  556.     pOp->incValue(attrName[1], val32);
  557.     break;
  558.   case 2:
  559.     pOp->incValue(attr1, val32);
  560.     break;
  561.   case 3:
  562.     pOp->incValue(attrName[1], val64);
  563.     break;
  564.   case 4:
  565.     pOp->incValue(attr1, val64);
  566.     break;
  567.   case 5:
  568.     pOp->incValue(attrName[0], val32);
  569.     ret_val = FAIL ;
  570.     break;
  571.   case 6:
  572.     pOp->incValue(attrName[0], val64);
  573.     ret_val = FAIL ;
  574.     break;
  575.   case 7:
  576.     pOp->incValue(attr0, val32);
  577.     ret_val = FAIL ;
  578.     break;
  579.   case 8:
  580.     pOp->incValue(attr0, val64);
  581.     ret_val = FAIL ;
  582.     break;
  583.   case 9:
  584.     pOp->incValue("COL20", val32);
  585.     ret_val = FAIL ;
  586.     break;
  587.   case 10:
  588.     pOp->incValue("COL20", val64);
  589.     ret_val = FAIL ;
  590.     break;
  591.   case 11:
  592.     pOp->incValue(attr20, val32);
  593.     ret_val = FAIL ;
  594.     break;
  595.   case 12:
  596.     pOp->incValue(attr20, val64);
  597.     ret_val = FAIL ;
  598.     break;
  599.   default:
  600.       break ;
  601.   }
  602.   return ret_val;
  603. }
  604. TTYPE t_subValue(int nCalls, NdbOperation* pOp) {
  605.   ndbout << "Defining subValue test " << nCalls << ": ";
  606.   Uint32 val32 = 5;
  607.   Uint64 val64 = 5;
  608.   Uint32 attr0 = 0;
  609.   Uint32 attr1 = 1;
  610.   Uint32 attr20 = 20;
  611.   TTYPE ret_val = NO_FAIL;
  612.   switch(nCalls) {
  613.   case 1:
  614.     pOp->subValue("COL2", val32);
  615.     break;
  616.   case 2:
  617.     pOp->subValue(attr1, val32);
  618.     break;
  619.   case 3:
  620.     pOp->subValue("COL0", val32);
  621.     ret_val = FAIL ;
  622.     break;
  623.   case 4:
  624.     pOp->subValue(attr0, val32);
  625.     ret_val = FAIL ;
  626.     break;
  627.   case 5:
  628.     pOp->subValue("COL20", val32);
  629.     ret_val = FAIL ;
  630.     break;
  631.   case 6:
  632.     pOp->subValue(attr20, val32);
  633.     ret_val = FAIL ;
  634.     break;
  635.   case 7:
  636.     // Missing implementation
  637.     //pOp->subValue("COL20", val64);
  638.     ndbout << "Missing implementation" << endl;
  639.     break;
  640.   case 8:
  641.     // Missing implementation
  642.     //pOp->subValue("COL2", val64);
  643.     ndbout << "Missing implementation" << endl;
  644.     break;
  645.   case 9:
  646.     // Missing implementation
  647.     //pOp->subValue("COL0", val64);
  648.     ndbout << "Missing implementation" << endl;
  649.     break;
  650.   case 10:
  651.     // Missing implementation
  652.     //pOp->subValue(attr1, val64);
  653.     ndbout << "Missing implementation" << endl;
  654.     break;
  655.   case 11:
  656.     // Missing implementation
  657.     //pOp->subValue(attr0, val64);
  658.     ndbout << "Missing implementation" << endl;
  659.     break;
  660.   case 12:
  661.     // Missing implementation
  662.     //pOp->subValue(attr20, val64);
  663.     ndbout << "Missing implementation" << endl;
  664.     break;
  665.   default:
  666.       break ;
  667.   }
  668.   return ret_val ;
  669. }
  670. TTYPE t_readAttr(int nCalls, NdbOperation* pOp) {
  671.   ndbout << "Defining readAttr test " << nCalls << ": ";
  672.   Uint32 attr0 = 0;
  673.   Uint32 attr1 = 1;
  674.   Uint32 attr20 = 20;
  675.   TTYPE ret_val = NO_FAIL;
  676.   switch(nCalls) {
  677.   case 1:
  678.     pOp->read_attr("COL1", 1);
  679.     break;
  680.   case 2:
  681.     pOp->read_attr(attr1, 1);
  682.     ret_val = NO_FAIL ;
  683.     break;
  684.   case 3:
  685.     pOp->read_attr("COL0", 1);
  686.     ret_val = NO_FAIL ;
  687.     break;
  688.   case 4:
  689.     pOp->read_attr(attr0, 1);
  690.     ret_val = NO_FAIL ;
  691.     break;
  692.   case 5:
  693.     pOp->read_attr("COL20", 1);
  694.     ret_val = FAIL ;
  695.     break;
  696.   case 6:
  697.     pOp->read_attr(20, 1);
  698.     ret_val = FAIL ;
  699.     break;
  700.   case 7:
  701.     pOp->read_attr("COL1", 8);
  702.     ret_val = FAIL ;
  703.     break;
  704.   case 8:
  705.     pOp->read_attr(attr1, 8);
  706.     ret_val = FAIL ;
  707.     break;
  708.   default:
  709.       break ;
  710.   }
  711.   return ret_val;
  712. }
  713. TTYPE t_writeAttr(int nCalls, NdbOperation* pOp) {
  714.   ndbout << "Defining writeAttr test " << nCalls << ": ";
  715.   pOp->load_const_u32(1, 5);
  716.   Uint32 attr0 = 0;
  717.   Uint32 attr1 = 1;
  718.   Uint32 attr20 = 20;
  719.   TTYPE ret_val = NO_FAIL ;
  720.   switch(nCalls) {
  721.   case 1:
  722.     pOp->write_attr("COL1", 1);
  723.     break;
  724.   case 2:
  725.     pOp->write_attr(attr1, 1);
  726.     break;
  727.   case 3:
  728.     pOp->write_attr("COL0", 1);
  729.     ret_val = FAIL ;
  730.     break;
  731.   case 4:
  732.     pOp->write_attr(attr0, 1);
  733.     ret_val = FAIL ;
  734.     break;
  735.   case 5:
  736.     pOp->write_attr("COL20", 1);
  737.     ret_val = FAIL ;
  738.     break;
  739.   case 6:
  740.     pOp->write_attr(20, 1);
  741.     ret_val = FAIL ;
  742.     break;
  743.   case 7:
  744.     pOp->write_attr("COL1", 2);
  745.     ret_val = FAIL ;
  746.     break;
  747.   case 8:
  748.     pOp->write_attr(attr1, 2);
  749.     ret_val = FAIL ;
  750.     break;
  751.   case 9:
  752.     pOp->write_attr("COL1", 8);
  753.     ret_val = FAIL ;
  754.     break;
  755.   case 10:
  756.     pOp->write_attr(attr1, 8);
  757.     ret_val = FAIL ;
  758.     break;
  759.   default:
  760.       break ;
  761.   }
  762.   return ret_val ;
  763. }
  764. TTYPE t_loadConst(int nCalls, NdbOperation* pOp, int opType) {
  765.   ndbout << "Defining loadConst test " << nCalls << " : ";
  766.   TTYPE ret_val = NO_FAIL ;
  767.   switch(nCalls) {
  768.   case 1:
  769.     // Loading null into a valid register
  770.     pOp->load_const_null(1);
  771.     break;
  772.   case 2:
  773.     // Loading null into an invalid register
  774.     pOp->load_const_null(8);
  775.     ret_val = FAIL ;
  776.     break;
  777.   case 3:
  778.     // Test loading a 32-bit value (>65536)
  779.     pOp->load_const_u32(1, 65600);
  780.     break;
  781.   case 4:
  782.     // Test loading a 16-bit value (<65536)
  783.     pOp->load_const_u32(1, 65500);
  784.     break;
  785.   case 5:
  786.     // Test by loading to a non-valid register
  787.     pOp->load_const_u32(8, 2);
  788.     ret_val = FAIL ;
  789.     break;
  790.   case 6:
  791.     // Test by loading a 64-bit value
  792.     pOp->load_const_u64(1, 65600);
  793.     break;
  794.   case 7:
  795.     // Test by loading a non-valid register
  796.     pOp->load_const_u64(8, 2);
  797.     ret_val = FAIL ;
  798.     break;
  799.   case 8:
  800.     // Test by loading a valid register with -1
  801.     pOp->load_const_u64(1, -1);
  802.     ret_val = FAIL ;
  803.     break;
  804.   default:
  805.       break ;
  806.   }
  807.   if (opType == 3 && FAIL != ret_val)
  808.     pOp->write_attr("COL1", 1);
  809.   return ret_val;
  810. }
  811. TTYPE t_branch(int nCalls, NdbOperation* pOp) {
  812.   ndbout << "Defining branch test " << nCalls << ": " ;
  813.   
  814.   TTYPE ret_val = NO_FAIL ;
  815.   Uint32 val32=5;
  816.   pOp->read_attr("COL1", 1);
  817.   pOp->load_const_u32(2, val32);
  818.   switch(nCalls) {
  819.   case 1:
  820.     pOp->branch_eq(1, 2, 0);
  821.     pOp->interpret_exit_nok();
  822.     pOp->def_label(0);
  823.     pOp->interpret_exit_ok();
  824.     break;
  825.   case 2:
  826.     pOp->branch_eq(2, 1, 0);
  827.     pOp->interpret_exit_nok();
  828.     pOp->def_label(0);
  829.     pOp->interpret_exit_ok();
  830.     break;
  831.   case 3:
  832.     pOp->branch_eq(1, 1, 0);
  833.     pOp->interpret_exit_nok();
  834.     pOp->def_label(0);
  835.     pOp->interpret_exit_ok();
  836.     break;
  837.   default:
  838.       //ndbout << "t_branch: default case (no test case)" << endl ;
  839.       //return ret_val = NO_FAIL ;
  840.       break ;
  841.   }
  842.   return ret_val;
  843. }
  844. TTYPE t_branchIfNull(int nCalls, NdbOperation* pOp) {
  845.   TTYPE ret_val = NO_FAIL;
  846.   ndbout << "Defining branchIfNull test " << nCalls << ": " << endl ;
  847.   switch(nCalls) {
  848.   case 1:
  849.     pOp->load_const_u32(1, 1);
  850.     pOp->branch_ne_null(1, 0);
  851.     pOp->interpret_exit_nok();
  852.     pOp->def_label(0);
  853.     pOp->interpret_exit_ok();
  854.     break;
  855.   case 2:
  856.     pOp->load_const_null(1);
  857.     pOp->branch_ne_null(1, 0);
  858.     pOp->interpret_exit_ok();
  859.     pOp->def_label(0);
  860.     pOp->interpret_exit_nok();
  861.     break;
  862.   case 3:
  863.     pOp->load_const_u32(1, 1);
  864.     pOp->branch_eq_null(1, 0);
  865.     pOp->interpret_exit_ok();
  866.     pOp->def_label(0);
  867.     pOp->interpret_exit_nok();
  868.     break;
  869.   case 4:
  870.     pOp->load_const_null(1);
  871.     pOp->branch_ne_null(1, 0);
  872.     pOp->interpret_exit_ok();
  873.     pOp->def_label(0);
  874.     pOp->interpret_exit_nok();
  875.     break;
  876.   case 5:
  877.     // Test with a non-initialized register
  878.     pOp->branch_ne_null(3, 0);
  879.     pOp->interpret_exit_ok();
  880.     pOp->def_label(0);
  881.     pOp->interpret_exit_nok();
  882.     ret_val = FAIL ;
  883.     break;
  884.   case 6:
  885.     // Test with a non-existing register
  886.     pOp->branch_ne_null(8, 0);
  887.     pOp->interpret_exit_ok();
  888.     pOp->def_label(0);
  889.     pOp->interpret_exit_nok();
  890.     ret_val = FAIL ;
  891.     break;
  892.   case 7:
  893.     // Test with a non-initialized register
  894.     pOp->branch_eq_null(3, 0);
  895.     pOp->interpret_exit_ok();
  896.     pOp->def_label(0);
  897.     pOp->interpret_exit_nok();
  898.     ret_val = FAIL ;
  899.     break;
  900.   case 8:
  901.     // Test with a non-existing register
  902.     pOp->branch_ne_null(8, 0);
  903.     pOp->interpret_exit_ok();
  904.     pOp->def_label(0);
  905.     pOp->interpret_exit_nok();
  906.     ret_val = FAIL ;
  907.     break;
  908.   default:
  909.       break ;
  910.   }
  911.   return ret_val;
  912. }
  913. TTYPE t_addReg(int nCalls, NdbOperation* pOp) {
  914.   TTYPE ret_val = NO_FAIL ;
  915.   
  916.   ndbout << "Defining addReg test " << nCalls << ": ";
  917.   pOp->load_const_u32(1, 65500);
  918.   pOp->load_const_u32(2, 500);
  919.   pOp->load_const_u64(3, 65600);
  920.   pOp->load_const_u64(4, 95600);
  921.   switch(nCalls) {
  922.   case 1:
  923.     pOp->add_reg(1, 2, 5);
  924.     break;
  925.   case 2:
  926.     pOp->add_reg(1, 3, 5);
  927.     break;
  928.   case 3:
  929.     pOp->add_reg(3, 1, 5);
  930.     break;
  931.   case 4:
  932.     pOp->add_reg(3, 4, 5);
  933.     break;
  934.   case 5:
  935.     pOp->add_reg(1, 6, 5);
  936.     break;
  937.   case 6:
  938.     pOp->add_reg(6, 1, 5);
  939.     break;
  940.   case 7: // illegal register
  941.     pOp->add_reg(1, 8, 5);
  942.     ret_val = FAIL ;
  943.     break;
  944.   case 8: // another illegal register
  945.     pOp->add_reg(8, 1, 5); 
  946.     ret_val = FAIL ;
  947.     break;
  948.   case 9: // and another one
  949.     pOp->add_reg(1, 2, 8);
  950.     ret_val = FAIL ;
  951.     break;
  952.   default:
  953.     break ;
  954.   }
  955.   pOp->load_const_u32(7, 65000);
  956.   pOp->branch_eq(5, 7, 0);
  957.   pOp->interpret_exit_nok();
  958.   pOp->def_label(0);
  959.   pOp->interpret_exit_ok();
  960.   return ret_val ;
  961. }
  962. TTYPE t_subReg(int nCalls, NdbOperation* pOp) {
  963.   TTYPE ret_val = NO_FAIL ;
  964.   ndbout << "Defining subReg test: " << nCalls << endl;
  965.   pOp->load_const_u32(1, 65500);
  966.   pOp->load_const_u32(2, 500);
  967.   pOp->load_const_u64(3, 65600);
  968.   pOp->load_const_u64(4, 95600);
  969.   switch(nCalls) {
  970.   case 1:
  971.     pOp->sub_reg(1, 2, 5);
  972.     pOp->load_const_u32(7, 65000);
  973.     break;
  974.   case 2:
  975.     pOp->sub_reg(1, 3, 5);
  976.     pOp->load_const_u64(7, (Uint64)-100);
  977.     break;
  978.   case 3:
  979.     pOp->sub_reg(3, 1, 5);
  980.     pOp->load_const_u64(7, (Uint64)100);
  981.     break;
  982.   case 4:
  983.     pOp->sub_reg(3, 4, 5);
  984.     pOp->load_const_u64(7, (Uint64)-30000);
  985.     break;
  986.   case 5:
  987.     pOp->sub_reg(1, 6, 5);
  988.     pOp->load_const_u64(7, 0);
  989.     ret_val = FAIL ;
  990.     break;
  991.   case 6:
  992.     pOp->sub_reg(6, 1, 5);
  993.     pOp->load_const_u64(7, 0);
  994.     ret_val = FAIL ;
  995.     break;
  996.   case 7:
  997.     pOp->sub_reg(1, 8, 5);
  998.     pOp->load_const_u64(7, 0);
  999.     ret_val = FAIL ;
  1000.     break;
  1001.   case 8:
  1002.     pOp->sub_reg(8, 1, 5);
  1003.     pOp->load_const_u64(7, 0);
  1004.     ret_val = FAIL ;
  1005.     break;
  1006.   case 9:
  1007.     pOp->sub_reg(1, 2, 8);
  1008.     pOp->load_const_u32(7, (Uint32)65000);
  1009.     ret_val = FAIL;
  1010.     break;
  1011.   default:
  1012.       //ndbout << "t_subReg: default case (no test case)" << endl ;
  1013.       //return ret_val = NO_FAIL ;
  1014.       break ;
  1015.   }
  1016.   pOp->branch_eq(5, 7, 0);
  1017.   pOp->interpret_exit_nok() ;
  1018.   pOp->def_label(0);
  1019.   pOp->interpret_exit_ok() ;
  1020.   return ret_val;
  1021. }
  1022. TTYPE t_subroutineWithBranchLabel(int nCalls, NdbOperation* pOp) {
  1023.   TTYPE ret_val = NO_FAIL ;
  1024.   ndbout << "Defining subroutineWithBranchLabel test:" << nCalls << endl;
  1025.   pOp->load_const_u32(1, 65500);
  1026.   pOp->load_const_u32(2, 500);
  1027.   pOp->load_const_u64(3, 65600);
  1028.   pOp->load_const_u64(4, 95600);
  1029.   pOp->load_const_u32(7, 65000);
  1030.   pOp->call_sub(0) ;
  1031.   switch(nCalls) {
  1032.   case 1:
  1033.     pOp->def_subroutine(0) ;
  1034.     pOp->add_reg(1, 2, 5);
  1035.     break;
  1036.   case 2:
  1037.     pOp->def_subroutine(0) ;
  1038.     pOp->add_reg(1, 3, 5);
  1039.     break;
  1040.   case 3:
  1041.     pOp->def_subroutine(0) ;
  1042.     pOp->add_reg(3, 1, 5);
  1043.     break;
  1044.   case 4:
  1045.     pOp->def_subroutine(0) ;
  1046.     pOp->add_reg(3, 4, 5);
  1047.     break;
  1048.   case 5:
  1049.     pOp->def_subroutine(0) ;
  1050.     pOp->add_reg(1, 6, 5);
  1051.     break;
  1052.   case 6:
  1053.     pOp->def_subroutine(0) ;
  1054.     pOp->add_reg(6, 1, 5);
  1055.     break;
  1056.   case 7: // illegal register
  1057.     pOp->def_subroutine(0) ;
  1058.     pOp->add_reg(1, 8, 5);
  1059.     ret_val = FAIL ;
  1060.     break;
  1061.   case 8: // another illegal register
  1062.     pOp->def_subroutine(0) ;
  1063.     pOp->add_reg(8, 1, 5); 
  1064.     ret_val = FAIL ;
  1065.     break;
  1066.   case 9: // and another one
  1067.     pOp->def_subroutine(0) ;
  1068.     pOp->add_reg(1, 2, 8);
  1069.     ret_val = FAIL ;
  1070.     break;
  1071.   case 10: // test subroutine nesting
  1072.       for(int sub = 0; sub < 25 ; ++sub){
  1073.           pOp->call_sub(sub) ;
  1074.           pOp->def_subroutine(sub + 1) ;
  1075.           pOp->interpret_exit_ok() ;
  1076.           pOp->ret_sub() ;
  1077.       }
  1078.     ret_val = FAIL ;
  1079.   default:
  1080.     break ;
  1081.   }
  1082.   
  1083.   pOp->branch_label(0) ;
  1084.   pOp->interpret_exit_nok() ;
  1085.   pOp->def_label(0) ;
  1086.   pOp->interpret_exit_ok() ;
  1087.   pOp->ret_sub() ;
  1088.   return ret_val ;
  1089. }
  1090. void scan_rows(Ndb* pMyNdb, int opType, int tupleType, int scanType) {
  1091.   int           check = -1 ; 
  1092.   int           loop_count_ops = nRecords ;
  1093.   int           eOf = -1 ;
  1094.   int           readValue = 0 ;
  1095.   int           readValue2 = 0 ;
  1096.   int           scanCount = 0 ;
  1097.   TTYPE         fail = NO_FAIL ;
  1098.   for (int count=0 ; count < loop_count_ops ; count++)    {
  1099.   NdbConnection* MyTransaction = pMyNdb->startTransaction();
  1100.   if (!MyTransaction) error_handler(pMyNdb->getNdbError(), NO_FAIL);
  1101.   NdbOperation*  MyOperation = MyTransaction->getNdbOperation(tableName);
  1102.   if (!MyOperation) error_handler(pMyNdb->getNdbError(), NO_FAIL);
  1103.   if (opType == 1)
  1104.     // Open for scan read, Creates the SCAN_TABREQ and if needed
  1105.     // SCAN_TABINFO signals.
  1106.     check = MyOperation->openScanRead(1);
  1107.   else if (opType == 2)
  1108.     // Open for scan with update of rows.
  1109.     check = MyOperation->openScanExclusive(1);
  1110.   // Create ATTRINFO signal(s) for interpreted program used for
  1111.   // defining search criteria and column values that should be returned.
  1112.   scanCount = count+1 ;
  1113.   switch(tupleType) {
  1114.   case 1:
  1115.     fail = t_exitMethods(scanCount, MyOperation,  opType);
  1116.     break;
  1117.   case 2:
  1118.     fail = t_incValue(scanCount, MyOperation);
  1119.     break;
  1120.   case 3:
  1121.     fail = t_subValue(scanCount, MyOperation);
  1122.     break;
  1123.   case 4:
  1124.     fail = t_readAttr(scanCount, MyOperation);
  1125.     break;
  1126.   case 5:
  1127.     fail = t_writeAttr(scanCount, MyOperation);
  1128.     break;
  1129.   case 6:
  1130.     fail = t_loadConst(scanCount, MyOperation,  opType);
  1131.     break;
  1132.   case 7:
  1133.     fail = t_branch(scanCount, MyOperation);
  1134.     break;
  1135.   case 8:
  1136.     fail = t_branchIfNull(scanCount, MyOperation);
  1137.     break;
  1138.   case 9:
  1139.     fail = t_addReg(scanCount, MyOperation);
  1140.     break;
  1141.   case 10:
  1142.     fail = t_subReg(scanCount, MyOperation);
  1143.     break;
  1144.   case 11:
  1145.     fail = t_subroutineWithBranchLabel(scanCount, MyOperation);
  1146.     break;
  1147.   default:
  1148.     break ;
  1149.   }
  1150.   if(11 != tupleType) MyOperation->getValue(attrName[1], (char*)&readValue);
  1151.   // Sends the SCAN_TABREQ, (SCAN_TABINFO) and ATTRINFO signals and then
  1152.   // reads the answer in TRANSID_AI. Confirmation is received through SCAN_TABCONF or
  1153.   // SCAN_TABREF if failure.
  1154.   check = MyTransaction->executeScan();
  1155.   if (check == -1) {
  1156.     //ndbout << endl << "executeScan returned: " << MyTransaction->getNdbError() << endl;
  1157.       error_handler(MyTransaction->getNdbError(), fail) ;
  1158.   pMyNdb->closeTransaction(MyTransaction);
  1159.   }else{
  1160.     // Sends the SCAN_NEXTREQ signal(s) and reads the answer in TRANS_ID signals.
  1161.     // SCAN_TABCONF or SCAN_TABREF is the confirmation.
  1162.     while ((eOf = MyTransaction->nextScanResult()) == 0) {
  1163.       ndbout << readValue <<"; ";
  1164.       // Here we call takeOverScanOp for update of the tuple.
  1165.     }
  1166.     ndbout << endl ;
  1167.     pMyNdb->closeTransaction(MyTransaction);
  1168.     if (eOf == -1) {
  1169.       ndbout << endl << "nextScanResult returned: "<< MyTransaction->getNdbError() << endl;
  1170.     } else {
  1171.       ndbout << "OK" << endl;
  1172.     }
  1173.   }
  1174.   }
  1175.   return;
  1176. };
  1177. void  update_rows(Ndb* pMyNdb, int tupleType, int opType) {
  1178.    /****************************************************************
  1179.    *    Update rows in SimpleTable
  1180.    *    Only updates the first 3 cols.
  1181.    ***************************************************************/
  1182.   int check = -1 ;
  1183.   int loop_count_ops = nRecords ;
  1184.   int readValue[MAXATTR] = {0} ;
  1185.   TTYPE ret_val = NO_FAIL ;
  1186.   NdbConnection     *MyTransaction = NULL ;
  1187.   NdbOperation      *MyOperation = NULL ;
  1188.   ndbout << "Updating records ..." << endl << endl;
  1189.   for (int count=0 ; count < loop_count_ops ; count++){
  1190.     MyTransaction = pMyNdb->startTransaction();
  1191.     if (!MyTransaction) {
  1192.       error_handler(pMyNdb->getNdbError(), NO_FAIL);
  1193.       return;
  1194.     }//if
  1195.     MyOperation = MyTransaction->getNdbOperation(tableName);
  1196.     if (MyOperation == NULL) {
  1197.       error_handler(pMyNdb->getNdbError(), NO_FAIL);
  1198.       return;
  1199.     }//if
  1200.     //   if (operationType == 3)
  1201.     check = MyOperation->interpretedUpdateTuple();
  1202.     // else if (operationType == 4)
  1203.     // check = MyOperation->interpretedDirtyUpdate();
  1204.     if( check == -1 )
  1205.       error_handler(MyTransaction->getNdbError(), NO_FAIL);
  1206.     check = MyOperation->equal( attrName[0], (char*)&pkValue[count] );
  1207.     if( check == -1 )
  1208.       error_handler(MyTransaction->getNdbError(), NO_FAIL);
  1209.     switch(tupleType) {
  1210.     case 1:
  1211.       ret_val = t_exitMethods(count+1, MyOperation,  opType);
  1212.       break;
  1213.     case 2:
  1214.       ret_val = t_incValue(count+1, MyOperation);
  1215.       break;
  1216.     case 3:
  1217.       ret_val = t_subValue(count+1, MyOperation);
  1218.       break;
  1219.     case 4:
  1220.       ret_val = t_readAttr(count+1, MyOperation);
  1221.       break;
  1222.     case 5:
  1223.       ret_val = t_writeAttr(count+1, MyOperation);
  1224.       break;
  1225.     case 6:
  1226.       ret_val = t_loadConst(count+1, MyOperation,  opType);
  1227.       break;
  1228.     case 7:
  1229.       ret_val = t_branch(count+1, MyOperation);
  1230.       break;
  1231.     case 8:
  1232.       ret_val = t_branchIfNull(count+1, MyOperation);
  1233.       break;
  1234.     case 9:
  1235.       ret_val = t_addReg(count+1, MyOperation);
  1236.       break;
  1237.     case 10:
  1238.       ret_val = t_subReg(count+1, MyOperation);
  1239.       break;
  1240.     case 11:
  1241.       ret_val = t_subroutineWithBranchLabel(count+1, MyOperation);
  1242.       break;
  1243.     default:
  1244.         break ;
  1245.     }
  1246.     MyOperation->getValue("COL1", (char*)&readValue);
  1247.     if (MyTransaction->execute( Commit ) == -1 ) {
  1248.        error_handler(MyTransaction->getNdbError(), ret_val);
  1249.     }else if (NO_FAIL == ret_val ) {
  1250.       ndbout << "OK" << endl;
  1251.     } else {
  1252.       bTestPassed = -1;
  1253.       ndbout << "Test passed when expected to fail" << endl;
  1254.     }//if
  1255.     pMyNdb->closeTransaction(MyTransaction);
  1256.   }
  1257.   ndbout << "Finished updating records" << endl;
  1258.   return;
  1259. };
  1260. void delete_rows(Ndb* pMyNdb, int tupleTest, int opType) {
  1261.   /****************************************************************
  1262.    *    Delete rows from SimpleTable
  1263.    *
  1264.    ***************************************************************/
  1265.   int check = 1 ;
  1266.   int loop_count_ops = nRecords ;
  1267.   int readValue[MAXATTR] = {0};
  1268.   NdbConnection     *MyTransaction = NULL ;
  1269.   NdbOperation      *MyOperation = NULL ;
  1270.   TTYPE ret_val = NO_FAIL ;
  1271.   
  1272.   ndbout << "Deleting records ..."<< endl << endl;
  1273.  
  1274.   for (int count=0 ; count < loop_count_ops ; count++)    {
  1275.     MyTransaction = pMyNdb->startTransaction();
  1276.     if (!MyTransaction) error_handler(pMyNdb->getNdbError(), NO_FAIL) ;
  1277.     
  1278.     MyOperation = MyTransaction->getNdbOperation(tableName);
  1279.     if (!MyOperation) error_handler(pMyNdb->getNdbError(), NO_FAIL) ;
  1280.     check = MyOperation->interpretedDeleteTuple();
  1281.     if( check == -1 ) error_handler(MyTransaction->getNdbError(), NO_FAIL) ;
  1282.     check = MyOperation->equal( attrName[0], (char*)&pkValue[count] );
  1283.     if( check == -1 ) error_handler(MyTransaction->getNdbError(), NO_FAIL) ;
  1284.       switch(tupleTest) {
  1285.       case 1:
  1286.         ret_val = t_exitMethods(count+1, MyOperation,  opType);
  1287.         break;
  1288.       case 2:
  1289.         ret_val = t_incValue(count+1, MyOperation);
  1290.         break;
  1291.       case 3:
  1292.         ret_val = t_subValue(count+1, MyOperation);
  1293.         break;
  1294.       case 4:
  1295.         ret_val = t_readAttr(count+1, MyOperation);
  1296.         break;
  1297.       case 5:
  1298.         ret_val = t_writeAttr(count+1, MyOperation);
  1299.         break;
  1300.       case 6:
  1301.         ret_val = t_loadConst(count+1, MyOperation, opType);
  1302.         break;
  1303.       case 7:
  1304.         ret_val = t_branch(count+1, MyOperation);
  1305.         break;
  1306.       case 8:
  1307.         ret_val = t_branchIfNull(count+1, MyOperation);
  1308.         break;
  1309.       case 9:
  1310.         ret_val = t_addReg(count+1, MyOperation);
  1311.         break;
  1312.       case 10:
  1313.         ret_val = t_subReg(count+1, MyOperation);
  1314.         break;
  1315.       case 11:
  1316.         ret_val = t_subroutineWithBranchLabel(count+1, MyOperation);
  1317.         break;
  1318.       default:
  1319.         break ;
  1320.       }
  1321.       if(11 != tupleTest)MyOperation->getValue(attrName[1], (char*)&readValue) ;
  1322.       if (MyTransaction->execute( Commit ) == -1 ) {
  1323.          error_handler(MyTransaction->getNdbError(), ret_val);
  1324.       } else if (NO_FAIL == ret_val /*|| UNDEF == ret_val*/ ) {
  1325.         ndbout << "OK" << endl;
  1326.       } else {
  1327.         bTestPassed = -1;
  1328.         ndbout << "Test passed when expected to fail" << endl;
  1329.       }//if
  1330.       ndbout << endl;
  1331.       pMyNdb->closeTransaction(MyTransaction);
  1332.    }
  1333.    ndbout << "Finished deleting records" << endl;
  1334.    return;
  1335. };
  1336. inline void setAttrNames(){
  1337.   for (int i = 0; i < MAXATTR; i++){
  1338.       BaseString::snprintf(attrName[i], MAXSTRLEN, "COL%d", i);
  1339.     }
  1340. }
  1341. inline void setTableNames(){
  1342.   BaseString::snprintf(tableName, MAXSTRLEN, "TAB1");
  1343. }