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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include <NDBT.hpp>
  14. #include <NDBT_Test.hpp>
  15. #include <HugoTransactions.hpp>
  16. #include <UtilTransactions.hpp>
  17. #include <NdbRestarter.hpp>
  18. #include <NdbRestarts.hpp>
  19. #include <Vector.hpp>
  20. #include <random.h>
  21. #include <NdbTick.h>
  22. #define MAX_NDB_OBJECTS 32678
  23. #define CHECK(b) if (!(b)) { 
  24.   ndbout << "ERR: "<< step->getName() 
  25.          << " failed on line " << __LINE__ << endl; 
  26.   result = NDBT_FAILED; 
  27.   continue; } 
  28. #define CHECKE(b) if (!(b)) { 
  29.   errors++; 
  30.   ndbout << "ERR: "<< step->getName() 
  31.          << " failed on line " << __LINE__ << endl; 
  32.   result = NDBT_FAILED; 
  33.   continue; } 
  34. int runTestMaxNdb(NDBT_Context* ctx, NDBT_Step* step){
  35.   Uint32 loops = ctx->getNumLoops();
  36.   Uint32 l = 0;
  37.   int oldi = 0;
  38.   int result = NDBT_OK;
  39.   while (l < loops && result == NDBT_OK){
  40.     ndbout_c("loop %d", l + 1);
  41.     int errors = 0;
  42.     int maxErrors = 5;
  43.     
  44.     Vector<Ndb*> ndbVector;
  45.     int i = 0;
  46.     int init = 0;
  47.     do {      
  48.       
  49.       Ndb* pNdb = new Ndb("TEST_DB");
  50.       if (pNdb == NULL){
  51. ndbout << "pNdb == NULL" << endl;      
  52. errors++;
  53. continue;
  54.       }
  55.       i++;
  56.       ndbVector.push_back(pNdb);
  57.       
  58.       if (pNdb->init()){
  59. ERR(pNdb->getNdbError());
  60. errors++;
  61. continue;
  62.       }
  63.       
  64.       init++;
  65.     } while (errors == 0);
  66.     
  67.     ndbout << i << " ndb objects created" << endl;
  68.     
  69.     if (l > 0 && i != oldi && init != MAX_NDB_OBJECTS){
  70.       ndbout << l << ": not as manyNdb objects created" << endl
  71.      << i << " != " << oldi << endl;
  72.       result =  NDBT_FAILED;
  73.     }
  74.     oldi = i;
  75.       
  76.     
  77.     for(size_t j = 0;  j < ndbVector.size(); j++){
  78.       delete ndbVector[j];
  79.       if(((j+1) % 250) == 0){
  80. ndbout << "Deleted " << (Uint64) j << " ndb objects " << endl;
  81.       }
  82.     }
  83.     ndbVector.clear();
  84.     l++;
  85.   }
  86.   return result;
  87. }
  88. int runTestMaxTransaction(NDBT_Context* ctx, NDBT_Step* step){
  89.   Uint32 loops = ctx->getNumLoops();
  90.   Uint32 l = 0;
  91.   int oldi = 0;
  92.   int result = NDBT_OK;
  93.   Ndb* pNdb = new Ndb("TEST_DB");
  94.   if (pNdb == NULL){
  95.     ndbout << "pNdb == NULL" << endl;      
  96.     return NDBT_FAILED;  
  97.   }
  98.   if (pNdb->init(2048)){
  99.     ERR(pNdb->getNdbError());
  100.     delete pNdb;
  101.     return NDBT_FAILED;
  102.   }
  103.   while (l < loops && result == NDBT_OK){
  104.     int errors = 0;
  105.     int maxErrors = 5;
  106.     
  107.     Vector<NdbConnection*> conVector;
  108.     int i = 0;
  109.     do {      
  110.       NdbConnection* pCon;
  111.       
  112.       int type = i%4;
  113.       switch (type){
  114.       case 0:
  115. pCon = pNdb->startTransaction();
  116. break;
  117.       case 1:
  118. pCon = pNdb->startTransaction(2,
  119.       "DATA",
  120.       4);
  121. break;
  122.       case 2:
  123. ndbout_c("startTransactionDGroup not supported");
  124. abort();
  125. /*   
  126. pCon = pNdb->startTransactionDGroup(1, 
  127.     "TEST",
  128.     0);
  129. */
  130. break;
  131.       case 3:      
  132. ndbout_c("startTransactionDGroup not supported");
  133. abort();
  134. /*   
  135. pCon = pNdb->startTransactionDGroup(2, 
  136.     "TEST",
  137.     1);
  138. */
  139. break;
  140.       default:
  141. abort();
  142.       }
  143.       if (pCon == NULL){
  144. ERR(pNdb->getNdbError());
  145. errors++;
  146. continue;
  147.       }
  148.   
  149.       conVector.push_back(pCon);
  150.         
  151.       i++;      
  152.     } while (errors < maxErrors);
  153.     ndbout << i << " connections created" << endl;
  154.     if (l > 0 && i != oldi){
  155.       ndbout << l << ": not as many transactions created" << endl
  156.      << i << " != " << oldi << endl;
  157.       result =  NDBT_FAILED;
  158.     }
  159.     oldi = i;
  160.       
  161.     
  162.     for(size_t j = 0; j < conVector.size(); j++){
  163.       pNdb->closeTransaction(conVector[j]);
  164.     }
  165.     conVector.clear();
  166.     l++;
  167.   }
  168.   // BONUS Test closeTransaction with null trans
  169.   pNdb->closeTransaction(NULL);
  170.   delete pNdb;
  171.   return result;
  172. }
  173. int runTestMaxOperations(NDBT_Context* ctx, NDBT_Step* step){
  174.   Uint32 l = 1;
  175.   int result = NDBT_OK;
  176.   int maxOpsLimit = 1;
  177.   const NdbDictionary::Table* pTab = ctx->getTab();
  178.   Ndb* pNdb = new Ndb("TEST_DB");
  179.   if (pNdb == NULL){
  180.     ndbout << "pNdb == NULL" << endl;      
  181.     return NDBT_FAILED;  
  182.   }
  183.   if (pNdb->init(2048)){
  184.     ERR(pNdb->getNdbError());
  185.     delete pNdb;
  186.     return NDBT_FAILED;
  187.   }
  188.   HugoOperations hugoOps(*pTab);
  189.   bool endTest = false;
  190.   while (!endTest && result == NDBT_OK){
  191.     int errors = 0;
  192.     int maxErrors = 5;
  193.     maxOpsLimit = l*1000;    
  194.        
  195.     if (hugoOps.startTransaction(pNdb) != NDBT_OK){
  196.       delete pNdb;
  197.       return NDBT_FAILED;
  198.     }
  199.     
  200.     int i = 0;
  201.     while (errors < maxErrors){
  202.       
  203.       if(hugoOps.pkReadRecord(pNdb,1, 1) != NDBT_OK){
  204. errors++;
  205. continue;
  206.       }
  207.         
  208.       i++;      
  209.       if (i >= maxOpsLimit){
  210. errors = maxErrors;
  211.       }
  212.     }
  213.     ndbout << i << " operations used" << endl;
  214.     int execResult = hugoOps.execute_Commit(pNdb);
  215.     switch(execResult){
  216.     case NDBT_OK:
  217.       break;
  218.     case 233: // Out of operation records in transaction coordinator      
  219.       // OK - end test
  220.       endTest = true;
  221.       break;
  222.     default:
  223.       result = NDBT_FAILED;
  224.       break;
  225.     }
  226.     
  227.     hugoOps.closeTransaction(pNdb);
  228.     l++;
  229.   }
  230.   delete pNdb;
  231.   return result;
  232. }
  233. int runTestGetValue(NDBT_Context* ctx, NDBT_Step* step){
  234.   int result = NDBT_OK;
  235.   const NdbDictionary::Table* pTab = ctx->getTab();
  236.   Ndb* pNdb = new Ndb("TEST_DB");
  237.   if (pNdb == NULL){
  238.     ndbout << "pNdb == NULL" << endl;      
  239.     return NDBT_FAILED;  
  240.   }
  241.   if (pNdb->init(2048)){
  242.     ERR(pNdb->getNdbError());
  243.     delete pNdb;
  244.     return NDBT_FAILED;
  245.   }
  246.   HugoOperations hugoOps(*pTab);
  247.   
  248.   for (int m = 1; m < 100; m++){
  249.     int errors = 0;
  250.     int maxErrors = 5;
  251.       
  252.     NdbConnection* pCon = pNdb->startTransaction();
  253.     if (pCon == NULL){
  254.       delete pNdb;
  255.       return NDBT_FAILED;
  256.     }
  257.       
  258.     NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  259.     if (pOp == NULL){
  260.       pNdb->closeTransaction(pCon);
  261.       delete pNdb;
  262.       return NDBT_FAILED;
  263.     }
  264.       
  265.     if (pOp->readTuple() != 0){
  266.       pNdb->closeTransaction(pCon);
  267.       delete pNdb;
  268.       return NDBT_FAILED;
  269.     }
  270.       
  271.     for(int a = 0; a<pTab->getNoOfColumns(); a++){
  272.       if (pTab->getColumn(a)->getPrimaryKey() == true){
  273. if(hugoOps.equalForAttr(pOp, a, 1) != 0){
  274.   ERR(pCon->getNdbError());
  275.   pNdb->closeTransaction(pCon);
  276.   delete pNdb;
  277.   return NDBT_FAILED;
  278. }
  279.       }
  280.     }
  281.       
  282.     int i = 0;
  283.     int maxLimit = 1000*m;
  284.     do {      
  285.       if (pOp->getValue(pTab->getColumn(1)->getName()) == NULL) {
  286. const NdbError err = pCon->getNdbError();
  287. ERR(err);
  288. if (err.code == 0)
  289.   result = NDBT_FAILED;
  290. errors++;
  291. continue;
  292.       }
  293.       i++;             
  294.     } while (errors < maxErrors && i < maxLimit);
  295.       
  296.     ndbout << i << " getValues called" << endl;
  297.       
  298.     if (pCon->execute(Commit) != 0){
  299.       const NdbError err = pCon->getNdbError();
  300.       switch(err.code){
  301.       case 880: // TUP - Read too much
  302.       case 823: // TUP - Too much AI
  303.       case 4257: // NDBAPI - Too much AI
  304. // OK errors
  305. ERR(pCon->getNdbError());
  306. break;
  307.       default:
  308. ERR(pCon->getNdbError());
  309. ndbout << "Illegal error" << endl;
  310. result= NDBT_FAILED;
  311. break;
  312.       }
  313.     }
  314.       
  315.     pNdb->closeTransaction(pCon);
  316.   }// m
  317.   delete pNdb;
  318.   return result;
  319. }
  320. int runTestEqual(NDBT_Context* ctx, NDBT_Step* step){
  321.   Uint32 loops = ctx->getNumLoops();
  322.   Uint32 l = 0;
  323.   int result = NDBT_OK;
  324.   const NdbDictionary::Table* pTab = ctx->getTab();
  325.   Ndb* pNdb = new Ndb("TEST_DB");
  326.   if (pNdb == NULL){
  327.     ndbout << "pNdb == NULL" << endl;      
  328.     return NDBT_FAILED;  
  329.   }
  330.   if (pNdb->init(2048)){
  331.     ERR(pNdb->getNdbError());
  332.     delete pNdb;
  333.     return NDBT_FAILED;
  334.   }
  335.   HugoOperations hugoOps(*pTab);
  336.   
  337.   while (l < loops){
  338.     for(int m = 1; m < 10; m++){
  339.       int errors = 0;
  340.       int maxErrors = 5;
  341.       
  342.       NdbConnection* pCon = pNdb->startTransaction();
  343.       if (pCon == NULL){
  344. ndbout << "Could not start transaction" << endl;
  345. delete pNdb;
  346. return NDBT_FAILED;
  347.       }
  348.       
  349.       NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  350.       if (pOp == NULL){
  351. ERR(pCon->getNdbError());
  352. pNdb->closeTransaction(pCon);
  353. delete pNdb;
  354. return NDBT_FAILED;
  355.       }
  356.       
  357.       if (pOp->readTuple() != 0){
  358. ERR(pCon->getNdbError());
  359. pNdb->closeTransaction(pCon);
  360. delete pNdb;
  361. return NDBT_FAILED;
  362.       }
  363.       
  364.       int i = 0;
  365.       int maxLimit = 1000*m;      
  366.       do {      
  367. if ((l%2)!=0){
  368.   // Forward
  369.   for(int a = 0; a<pTab->getNoOfColumns(); a++){
  370.     if (pTab->getColumn(a)->getPrimaryKey() == true){
  371.       if(hugoOps.equalForAttr(pOp, a, 1) != 0){
  372. const NdbError err = pCon->getNdbError();
  373. ERR(err);
  374. if (err.code == 0)
  375.   result = NDBT_FAILED;
  376. errors++;
  377.       }
  378.     }
  379.   }
  380. } else {
  381.   // Backward
  382.   for(int a = pTab->getNoOfColumns()-1; a>=0; a--){
  383.     if (pTab->getColumn(a)->getPrimaryKey() == true){
  384.       if(hugoOps.equalForAttr(pOp, a, 1) != 0){
  385. const NdbError err = pCon->getNdbError();
  386. ERR(err);
  387. if (err.code == 0)
  388.   result = NDBT_FAILED;
  389. errors++;
  390.       }
  391.     }
  392.   }
  393. }
  394. i++;      
  395.       } while (errors < maxErrors && i < maxLimit);
  396.       
  397.       if (pOp->getValue(pTab->getColumn(1)->getName()) == NULL) {
  398.         const NdbError err = pCon->getNdbError();
  399. ERR(pCon->getNdbError());
  400. pNdb->closeTransaction(pCon);
  401. delete pNdb;
  402.         if (err.code == 4225) {
  403.           return NDBT_OK;
  404.         } else {
  405.           return NDBT_FAILED;
  406.         }//if
  407.       }
  408.       
  409.       ndbout << i << " equal called" << endl;
  410.       
  411.       
  412.       int check = pCon->execute(Commit);
  413.       if (check != 0){
  414. ERR(pCon->getNdbError());
  415.       }
  416.       
  417.       pNdb->closeTransaction(pCon);
  418.       
  419.     }// m
  420.     l++;
  421.     
  422.   }// l
  423.   
  424.   delete pNdb;
  425.   return result;
  426. }
  427. int runTestDeleteNdb(NDBT_Context* ctx, NDBT_Step* step){
  428.   Uint32 loops = ctx->getNumLoops();
  429.   Uint32 l = 0;
  430.   int result = NDBT_OK;
  431.   NdbRestarts restarts;
  432.   Vector<Ndb*> ndbVector;
  433.   const NdbDictionary::Table* pTab = ctx->getTab();
  434.   HugoTransactions hugoTrans(*pTab);
  435.   int records = ctx->getNumRecords();
  436.   
  437.   while (l < loops && result == NDBT_OK){
  438.     
  439.     // Create 5 ndb objects
  440.     for( int i = 0; i < 5; i++){
  441.       Ndb* pNdb = new Ndb("TEST_DB");
  442.       if (pNdb == NULL){
  443. ndbout << "pNdb == NULL" << endl;      
  444. result = NDBT_FAILED;
  445. goto end_test;
  446.       }
  447.       ndbVector.push_back(pNdb);
  448.       
  449.       if (pNdb->init()){
  450. ERR(pNdb->getNdbError());
  451. result = NDBT_FAILED;
  452. goto end_test;
  453.       }
  454.       if (pNdb->waitUntilReady() != 0){
  455. ERR(pNdb->getNdbError());
  456. result = NDBT_FAILED;
  457. goto end_test;
  458.       }
  459.       if (hugoTrans.pkReadRecords(pNdb, records) != 0){
  460. result = NDBT_FAILED;
  461. goto end_test;
  462.       }
  463.     }
  464.     
  465.     if ((l % 2) == 0){
  466.       // Restart random node 
  467.       ndbout << "Restart random node " << endl;
  468.       if(restarts.executeRestart("RestartRandomNodeAbort", 120) != 0){
  469. g_err << "Failed to executeRestart(RestartRandomNode)"<<endl;
  470. result = NDBT_FAILED;
  471. goto end_test;
  472.       }
  473.     } else {
  474.       // Restart all nodes
  475.       ndbout << "Restart all nodes " << endl;
  476.       if(restarts.executeRestart("RestartAllNodesAbort", 120) != 0){
  477. g_err << "Failed to executeRestart(RestartAllNodes)"<<endl;
  478. result = NDBT_FAILED;
  479. goto end_test;
  480.       }
  481.     }
  482.     
  483.     // Delete the ndb objects
  484.     for(size_t j = 0;  j < ndbVector.size(); j++)
  485.       delete ndbVector[j];
  486.     ndbVector.clear();
  487.     l++;
  488.   }
  489.   
  490.   
  491.  end_test:
  492.   
  493.   for(size_t i = 0;  i < ndbVector.size(); i++)
  494.     delete ndbVector[i];
  495.   ndbVector.clear();
  496.   
  497.   return result;
  498. }
  499. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  500.   int records = ctx->getNumRecords();
  501.   
  502.   UtilTransactions utilTrans(*ctx->getTab());
  503.   if (utilTrans.clearTable2(GETNDB(step),  records) != 0){
  504.     return NDBT_FAILED;
  505.   }
  506.   return NDBT_OK;
  507. }
  508. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  509.   int records = ctx->getNumRecords();
  510.   HugoTransactions hugoTrans(*ctx->getTab());
  511.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  512.     return NDBT_FAILED;
  513.   }
  514.   return NDBT_OK;
  515. }
  516. int runTestWaitUntilReady(NDBT_Context* ctx, NDBT_Step* step){
  517.   Ndb* pNdb = new Ndb("TEST_DB");
  518.   // Forget about calling pNdb->init();
  519.   if (pNdb->waitUntilReady() == 0){
  520.     ndbout << "waitUntilReady returned OK" << endl;
  521.     delete pNdb;
  522.     return NDBT_FAILED;
  523.   }
  524.   const NdbError err = pNdb->getNdbError();
  525.   delete pNdb;
  526.   ERR(err);
  527.   if (err.code != 4256)
  528.     return NDBT_FAILED;
  529.   
  530.   return NDBT_OK;
  531. }
  532. int runGetNdbOperationNoTab(NDBT_Context* ctx, NDBT_Step* step){
  533.   Ndb* pNdb = new Ndb("TEST_DB");
  534.   if (pNdb == NULL){
  535.     ndbout << "pNdb == NULL" << endl;      
  536.     return NDBT_FAILED;  
  537.   }
  538.   if (pNdb->init()){
  539.     ERR(pNdb->getNdbError());
  540.     delete pNdb;
  541.     return NDBT_FAILED;
  542.   }
  543.   
  544.   NdbConnection* pCon = pNdb->startTransaction();
  545.   if (pCon == NULL){
  546.     delete pNdb;
  547.     return NDBT_FAILED;
  548.   }
  549.   
  550.   // Call getNdbOperation on an unknown table
  551.   NdbOperation* pOp = pCon->getNdbOperation("HUPP76");
  552.   if (pOp == NULL){
  553.     NdbError err = pCon->getNdbError();
  554.     ERR(err);
  555.     if (err.code == 0){
  556.       pNdb->closeTransaction(pCon);
  557.       delete pNdb;
  558.       return NDBT_FAILED;
  559.     }    
  560.   }
  561.         
  562.   pNdb->closeTransaction(pCon);
  563.     
  564.   delete pNdb;
  565.   return NDBT_OK;
  566. }
  567. int runMissingOperation(NDBT_Context* ctx, NDBT_Step* step){
  568.   int result = NDBT_OK;
  569.   const NdbDictionary::Table* pTab = ctx->getTab();
  570.   Ndb* pNdb = new Ndb("TEST_DB");
  571.   if (pNdb == NULL){
  572.     ndbout << "pNdb == NULL" << endl;      
  573.     return NDBT_FAILED;  
  574.   }
  575.   if (pNdb->init()){
  576.     ERR(pNdb->getNdbError());
  577.     delete pNdb;
  578.     return NDBT_FAILED;
  579.   }
  580.   
  581.   NdbConnection* pCon = pNdb->startTransaction();
  582.   if (pCon == NULL){
  583.     pNdb->closeTransaction(pCon);  
  584.     delete pNdb;
  585.     return NDBT_FAILED;
  586.   }
  587.     
  588.   NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  589.   if (pOp == NULL){
  590.     ERR(pCon->getNdbError());
  591.     pNdb->closeTransaction(pCon);  
  592.     delete pNdb;
  593.     return NDBT_FAILED;
  594.   }
  595.   
  596.   // Forget about calling pOp->insertTuple();
  597.   
  598.   // Call getValue should not work
  599.   if (pOp->getValue(pTab->getColumn(1)->getName()) == NULL) {
  600.     const NdbError err = pCon->getNdbError();
  601.     ERR(err);
  602.     if (err.code == 0){
  603.       ndbout << "hupp" << endl;
  604.       result = NDBT_FAILED;
  605.     }
  606.   } else {
  607.       ndbout << "hupp2" << endl;
  608.     result = NDBT_FAILED;
  609.   }
  610.       
  611.   pNdb->closeTransaction(pCon);  
  612.   delete pNdb;
  613.   return result;
  614. }
  615. int runGetValueInUpdate(NDBT_Context* ctx, NDBT_Step* step){
  616.   const NdbDictionary::Table* pTab = ctx->getTab();
  617.   Ndb* pNdb = new Ndb("TEST_DB");
  618.   if (pNdb == NULL){
  619.     ndbout << "pNdb == NULL" << endl;      
  620.     return NDBT_FAILED;  
  621.   }
  622.   if (pNdb->init()){
  623.     ERR(pNdb->getNdbError());
  624.     delete pNdb;
  625.     return NDBT_FAILED;
  626.   }
  627.   
  628.   NdbConnection* pCon = pNdb->startTransaction();
  629.   if (pCon == NULL){
  630.     pNdb->closeTransaction(pCon);  
  631.     delete pNdb;
  632.     return NDBT_FAILED;
  633.   }
  634.     
  635.   NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  636.   if (pOp == NULL){
  637.     ERR(pCon->getNdbError());
  638.     pNdb->closeTransaction(pCon);  
  639.     delete pNdb;
  640.     return NDBT_FAILED;
  641.   }
  642.   
  643.   if (pOp->updateTuple() != 0){
  644.     pNdb->closeTransaction(pCon);
  645.     delete pNdb;
  646.     return NDBT_FAILED;
  647.   }
  648.   
  649.   // Call getValue should not work
  650.   if (pOp->getValue(pTab->getColumn(1)->getName()) == NULL) {
  651.     // It didn't work
  652.     const NdbError err = pCon->getNdbError();
  653.     ERR(err);
  654.     if (err.code == 0){
  655.       pNdb->closeTransaction(pCon);  
  656.       delete pNdb;
  657.       return NDBT_FAILED;
  658.     }
  659.   } else {
  660.     // It worked, not good!
  661.     pNdb->closeTransaction(pCon);  
  662.     delete pNdb;    
  663.     return NDBT_FAILED;
  664.   }
  665.   int check = pCon->execute(Commit);
  666.   if (check != 0){
  667.     ERR(pCon->getNdbError());
  668.   }
  669.   
  670.   pNdb->closeTransaction(pCon);  
  671.   delete pNdb;
  672.   return NDBT_OK;
  673. }
  674. int runUpdateWithoutValues(NDBT_Context* ctx, NDBT_Step* step){
  675.   int result = NDBT_OK;
  676.   const NdbDictionary::Table* pTab = ctx->getTab();
  677.   HugoOperations hugoOps(*pTab);
  678.   Ndb* pNdb = new Ndb("TEST_DB");
  679.   if (pNdb == NULL){
  680.     ndbout << "pNdb == NULL" << endl;      
  681.     return NDBT_FAILED;  
  682.   }
  683.   if (pNdb->init()){
  684.     ERR(pNdb->getNdbError());
  685.     delete pNdb;
  686.     return NDBT_FAILED;
  687.   }
  688.   
  689.   NdbConnection* pCon = pNdb->startTransaction();
  690.   if (pCon == NULL){
  691.     pNdb->closeTransaction(pCon);  
  692.     delete pNdb;
  693.     return NDBT_FAILED;
  694.   }
  695.     
  696.   NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  697.   if (pOp == NULL){
  698.     ERR(pCon->getNdbError());
  699.     pNdb->closeTransaction(pCon);  
  700.     delete pNdb;
  701.     return NDBT_FAILED;
  702.   }
  703.   
  704.   if (pOp->updateTuple() != 0){
  705.     pNdb->closeTransaction(pCon);
  706.     ERR(pOp->getNdbError());
  707.     delete pNdb;
  708.     return NDBT_FAILED;
  709.   }
  710.   for(int a = 0; a<pTab->getNoOfColumns(); a++){
  711.     if (pTab->getColumn(a)->getPrimaryKey() == true){
  712.       if(hugoOps.equalForAttr(pOp, a, 1) != 0){
  713. ERR(pCon->getNdbError());
  714. pNdb->closeTransaction(pCon);
  715. delete pNdb;
  716. return NDBT_FAILED;
  717.       }
  718.     }
  719.   }
  720.   // Dont' call any setValues
  721.   // Execute should not work
  722.   int check = pCon->execute(Commit);
  723.   if (check == 0){
  724.     ndbout << "execute worked" << endl;
  725.     result = NDBT_FAILED;
  726.   } else {
  727.     ERR(pCon->getNdbError());
  728.   }
  729.   
  730.   pNdb->closeTransaction(pCon);  
  731.   delete pNdb;
  732.   return result;
  733. }
  734. int runUpdateWithoutKeys(NDBT_Context* ctx, NDBT_Step* step){
  735.   int result = NDBT_OK;
  736.   const NdbDictionary::Table* pTab = ctx->getTab();
  737.   Ndb* pNdb = new Ndb("TEST_DB");
  738.   if (pNdb == NULL){
  739.     ndbout << "pNdb == NULL" << endl;      
  740.     return NDBT_FAILED;  
  741.   }
  742.   if (pNdb->init()){
  743.     ERR(pNdb->getNdbError());
  744.     delete pNdb;
  745.     return NDBT_FAILED;
  746.   }
  747.   
  748.   NdbConnection* pCon = pNdb->startTransaction();
  749.   if (pCon == NULL){
  750.     pNdb->closeTransaction(pCon);  
  751.     delete pNdb;
  752.     return NDBT_FAILED;
  753.   }
  754.     
  755.   NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  756.   if (pOp == NULL){
  757.     ERR(pCon->getNdbError());
  758.     pNdb->closeTransaction(pCon);  
  759.     delete pNdb;
  760.     return NDBT_FAILED;
  761.   }
  762.   
  763.   if (pOp->updateTuple() != 0){
  764.     pNdb->closeTransaction(pCon);
  765.     ERR(pOp->getNdbError());
  766.     delete pNdb;
  767.     return NDBT_FAILED;
  768.   }
  769.   // Dont' call any equal or setValues
  770.   // Execute should not work
  771.   int check = pCon->execute(Commit);
  772.   if (check == 0){
  773.     ndbout << "execute worked" << endl;
  774.     result = NDBT_FAILED;
  775.   } else {
  776.     ERR(pCon->getNdbError());
  777.   }
  778.   
  779.   pNdb->closeTransaction(pCon);  
  780.   delete pNdb;
  781.   return result;
  782. }
  783. int runReadWithoutGetValue(NDBT_Context* ctx, NDBT_Step* step){
  784.   int result = NDBT_OK;
  785.   const NdbDictionary::Table* pTab = ctx->getTab();
  786.   HugoOperations hugoOps(*pTab);
  787.   Ndb* pNdb = GETNDB(step);
  788.   Uint32 lm;
  789.   for(Uint32 cm= 0; cm < 2; cm++)
  790.   {
  791.     for(lm= 0; lm <= NdbOperation::LM_CommittedRead; lm++)
  792.     {
  793.       NdbConnection* pCon = pNdb->startTransaction();
  794.       if (pCon == NULL){
  795. pNdb->closeTransaction(pCon);  
  796. return NDBT_FAILED;
  797.       }
  798.     
  799.       NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  800.       if (pOp == NULL){
  801. ERR(pCon->getNdbError());
  802. pNdb->closeTransaction(pCon);  
  803. return NDBT_FAILED;
  804.       }
  805.   
  806.       if (pOp->readTuple((NdbOperation::LockMode)lm) != 0){
  807. pNdb->closeTransaction(pCon);
  808. ERR(pOp->getNdbError());
  809. return NDBT_FAILED;
  810.       }
  811.     
  812.       for(int a = 0; a<pTab->getNoOfColumns(); a++){
  813. if (pTab->getColumn(a)->getPrimaryKey() == true){
  814.   if(hugoOps.equalForAttr(pOp, a, 1) != 0){
  815.     ERR(pCon->getNdbError());
  816.     pNdb->closeTransaction(pCon);
  817.     return NDBT_FAILED;
  818.   }
  819. }
  820.       }
  821.     
  822.       // Dont' call any getValues
  823.     
  824.       // Execute should work
  825.       int check = pCon->execute(cm == 0 ? NoCommit : Commit);
  826.       if (check == 0){
  827. ndbout << "execute worked" << endl;
  828.       } else {
  829. ERR(pCon->getNdbError());
  830. result = NDBT_FAILED;
  831.       }
  832.     
  833.       pNdb->closeTransaction(pCon);  
  834.     }
  835.   }
  836.   /**
  837.    * Now test scans
  838.    */
  839.   for(lm= 0; lm <= NdbOperation::LM_CommittedRead; lm++)
  840.   {
  841.     NdbConnection* pCon = pNdb->startTransaction();
  842.     if (pCon == NULL){
  843.       pNdb->closeTransaction(pCon);  
  844.       return NDBT_FAILED;
  845.     }
  846.     
  847.     NdbScanOperation* pOp = pCon->getNdbScanOperation(pTab->getName());
  848.     if (pOp == NULL){
  849.       ERR(pCon->getNdbError());
  850.       pNdb->closeTransaction(pCon);  
  851.       return NDBT_FAILED;
  852.     }
  853.     
  854.     NdbResultSet *rs;
  855.     if ((rs = pOp->readTuples((NdbOperation::LockMode)lm)) == 0){
  856.       pNdb->closeTransaction(pCon);
  857.       ERR(pOp->getNdbError());
  858.       return NDBT_FAILED;
  859.     }
  860.     
  861.     
  862.     // Dont' call any getValues
  863.     
  864.     // Execute should work
  865.     int check = pCon->execute(NoCommit);
  866.     if (check == 0){
  867.       ndbout << "execute worked" << endl;
  868.     } else {
  869.       ERR(pCon->getNdbError());
  870.       result = NDBT_FAILED;
  871.     }
  872.   
  873.     int res;
  874.     while((res = rs->nextResult()) == 0);
  875.     pNdb->closeTransaction(pCon);  
  876.     
  877.     if(res != 1)
  878.       result = NDBT_FAILED;
  879.   }
  880.   
  881.   return result;
  882. }
  883. int runCheckGetNdbErrorOperation(NDBT_Context* ctx, NDBT_Step* step){
  884.   int result = NDBT_OK;
  885.   const NdbDictionary::Table* pTab = ctx->getTab();
  886.   Ndb* pNdb = new Ndb("TEST_DB");
  887.   if (pNdb == NULL){
  888.     ndbout << "pNdb == NULL" << endl;      
  889.     return NDBT_FAILED;  
  890.   }
  891.   if (pNdb->init(2048)){
  892.     ERR(pNdb->getNdbError());
  893.     delete pNdb;
  894.     return NDBT_FAILED;
  895.   }
  896.   HugoOperations hugoOps(*pTab);
  897.   
  898.   
  899.   NdbConnection* pCon = pNdb->startTransaction();
  900.   if (pCon == NULL){
  901.     ndbout << "Could not start transaction" << endl;
  902.     delete pNdb;
  903.     return NDBT_FAILED;
  904.   }
  905.   
  906.   NdbOperation* pOp = pCon->getNdbOperation(pTab->getName());
  907.   if (pOp == NULL){
  908.     ERR(pCon->getNdbError());
  909.     pNdb->closeTransaction(pCon);
  910.     delete pNdb;
  911.     return NDBT_FAILED;
  912.   }
  913.   
  914.   // Dont call readTuple here
  915.   // That's the error!
  916.   
  917.   for(int a = 0; a<pTab->getNoOfColumns(); a++){
  918.     if (pTab->getColumn(a)->getPrimaryKey() == true){
  919.       if(hugoOps.equalForAttr(pOp, a, 1) != 0){
  920. // An error has occured, check that 
  921. // it's possible to get the NdbErrorOperation
  922. const NdbError err = pCon->getNdbError();
  923. ERR(err);
  924. if (err.code == 0)
  925.   result = NDBT_FAILED;
  926. NdbOperation* pOp2 = pCon->getNdbErrorOperation();
  927. if (pOp2 == NULL)
  928.   result = NDBT_FAILED;
  929. else {
  930.   const NdbError err2 = pOp2->getNdbError();
  931.   ERR(err2);
  932.   if (err.code == 0)
  933.     result = NDBT_FAILED;
  934. }
  935.       }
  936.     }
  937.   }
  938.   
  939.   pNdb->closeTransaction(pCon);
  940.     
  941.   delete pNdb;
  942.   return result;
  943. }
  944. #define C2(x) { int _x= (x); if(_x == 0) return NDBT_FAILED; }
  945. int runBug_11133(NDBT_Context* ctx, NDBT_Step* step){
  946.   int result = NDBT_OK;
  947.   const NdbDictionary::Table* pTab = ctx->getTab();
  948.   HugoOperations hugoOps(*pTab);
  949.   Ndb* pNdb = GETNDB(step);
  950.   C2(hugoOps.startTransaction(pNdb) == 0);
  951.   C2(hugoOps.pkInsertRecord(pNdb, 0, 1) == 0);
  952.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  953.   C2(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0);
  954.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  955.   C2(hugoOps.pkWriteRecord(pNdb, 0, 1) == 0);
  956.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  957.   C2(hugoOps.pkWriteRecord(pNdb, 0, 1) == 0);
  958.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  959.   C2(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0);
  960.   C2(hugoOps.execute_Commit(pNdb) == 0);
  961.   C2(hugoOps.closeTransaction(pNdb) == 0);
  962.   C2(hugoOps.startTransaction(pNdb) == 0);
  963.   C2(hugoOps.pkInsertRecord(pNdb, 0, 1) == 0);
  964.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  965.   C2(hugoOps.pkWriteRecord(pNdb, 0, 1) == 0);
  966.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  967.   C2(hugoOps.pkWriteRecord(pNdb, 0, 1) == 0);
  968.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  969.   C2(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0);
  970.   C2(hugoOps.execute_Commit(pNdb) == 0);
  971.   C2(hugoOps.closeTransaction(pNdb) == 0);
  972.   C2(hugoOps.startTransaction(pNdb) == 0);
  973.   C2(hugoOps.pkInsertRecord(pNdb, 0, 1) == 0);
  974.   C2(hugoOps.execute_Commit(pNdb) == 0);
  975.   C2(hugoOps.closeTransaction(pNdb) == 0);
  976.   C2(hugoOps.startTransaction(pNdb) == 0);
  977.   C2(hugoOps.pkReadRecord(pNdb, 0, 1, NdbOperation::LM_Exclusive) == 0);
  978.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  979.   C2(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0);
  980.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  981.   C2(hugoOps.pkWriteRecord(pNdb, 0, 1) == 0);
  982.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  983.   C2(hugoOps.pkWriteRecord(pNdb, 0, 1) == 0);
  984.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  985.   C2(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0);
  986.   C2(hugoOps.execute_Commit(pNdb) == 0);
  987.   C2(hugoOps.closeTransaction(pNdb) == 0);
  988.   Ndb ndb2("TEST_DB");
  989.   C2(ndb2.init() == 0);
  990.   C2(ndb2.waitUntilReady() == 0);
  991.   HugoOperations hugoOps2(*pTab);  
  992.   C2(hugoOps.startTransaction(pNdb) == 0);
  993.   C2(hugoOps.pkInsertRecord(pNdb, 0, 1) == 0);
  994.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  995.   C2(hugoOps2.startTransaction(&ndb2) == 0);
  996.   C2(hugoOps2.pkWriteRecord(&ndb2, 0, 1) == 0);
  997.   C2(hugoOps2.execute_async(&ndb2, NoCommit) == 0);
  998.   C2(hugoOps.execute_Commit(pNdb) == 0);
  999.   C2(hugoOps2.wait_async(&ndb2) == 0);
  1000.   C2(hugoOps.closeTransaction(pNdb) == 0);
  1001.   C2(hugoOps2.closeTransaction(&ndb2) == 0);  
  1002.   C2(hugoOps.startTransaction(pNdb) == 0);
  1003.   C2(hugoOps.pkDeleteRecord(pNdb, 0, 1) == 0);
  1004.   C2(hugoOps.execute_NoCommit(pNdb) == 0);
  1005.   C2(hugoOps2.startTransaction(&ndb2) == 0);
  1006.   C2(hugoOps2.pkWriteRecord(&ndb2, 0, 1) == 0);
  1007.   C2(hugoOps2.execute_async(&ndb2, NoCommit) == 0);
  1008.   C2(hugoOps.execute_Commit(pNdb) == 0);
  1009.   C2(hugoOps2.wait_async(&ndb2) == 0);
  1010.   C2(hugoOps.closeTransaction(pNdb) == 0);
  1011.   C2(hugoOps2.closeTransaction(&ndb2) == 0);  
  1012.   return result;
  1013. }
  1014. NDBT_TESTSUITE(testNdbApi);
  1015. TESTCASE("MaxNdb", 
  1016.  "Create Ndb objects until no more can be createdn"){ 
  1017.   INITIALIZER(runTestMaxNdb);
  1018. }
  1019. TESTCASE("MaxTransactions", 
  1020.  "Start transactions until no more can be createdn"){ 
  1021.   INITIALIZER(runTestMaxTransaction);
  1022. }
  1023. TESTCASE("MaxOperations", 
  1024. "Get operations until no more can be createdn"){ 
  1025.   INITIALIZER(runLoadTable);
  1026.   INITIALIZER(runTestMaxOperations);
  1027.   FINALIZER(runClearTable);
  1028. }
  1029. TESTCASE("MaxGetValue", 
  1030. "Call getValue loads of timen"){ 
  1031.   INITIALIZER(runLoadTable);
  1032.   INITIALIZER(runTestGetValue);
  1033.   FINALIZER(runClearTable);
  1034. }
  1035. TESTCASE("MaxEqual", 
  1036. "Call equal loads of timen"){ 
  1037.   INITIALIZER(runTestEqual);
  1038. }
  1039. TESTCASE("DeleteNdb", 
  1040. "Make sure that a deleted Ndb object is properly deletedn"
  1041. "and removed from transportern"){ 
  1042.   INITIALIZER(runLoadTable);
  1043.   INITIALIZER(runTestDeleteNdb);
  1044.   FINALIZER(runClearTable);
  1045. }
  1046. TESTCASE("WaitUntilReady", 
  1047. "Make sure you get an error message when calling waitUntilReadyn"
  1048. "without an init'ed Ndbn"){ 
  1049.   INITIALIZER(runTestWaitUntilReady);
  1050. }
  1051. TESTCASE("GetOperationNoTab", 
  1052. "Call getNdbOperation on a table that does not existn"){ 
  1053.   INITIALIZER(runGetNdbOperationNoTab);
  1054. }
  1055. TESTCASE("MissingOperation", 
  1056. "Missing operation request(insertTuple) should give an error coden"){ 
  1057.   INITIALIZER(runMissingOperation);
  1058. }
  1059. TESTCASE("GetValueInUpdate", 
  1060. "Test that it's not possible to perform getValue in an updaten"){ 
  1061.   INITIALIZER(runLoadTable);
  1062.   INITIALIZER(runGetValueInUpdate);
  1063.   FINALIZER(runClearTable);
  1064. }
  1065. TESTCASE("UpdateWithoutKeys", 
  1066. "Test that it's not possible to perform update without settingn"
  1067.  "PKs"){ 
  1068.   INITIALIZER(runLoadTable);
  1069.   INITIALIZER(runUpdateWithoutKeys);
  1070.   FINALIZER(runClearTable);
  1071. }
  1072. TESTCASE("UpdateWithoutValues", 
  1073. "Test that it's not possible to perform update without setValuesn"){ 
  1074.   INITIALIZER(runLoadTable);
  1075.   INITIALIZER(runUpdateWithoutValues);
  1076.   FINALIZER(runClearTable);
  1077. }
  1078. TESTCASE("NdbErrorOperation", 
  1079.  "Test that NdbErrorOperation is properly set"){
  1080.   INITIALIZER(runCheckGetNdbErrorOperation);
  1081. }
  1082. TESTCASE("ReadWithoutGetValue", 
  1083.  "Test that it's possible to perform read wo/ getvalue'sn"){ 
  1084.   INITIALIZER(runLoadTable);
  1085.   INITIALIZER(runReadWithoutGetValue);
  1086.   FINALIZER(runClearTable);
  1087. }
  1088. TESTCASE("Bug_11133", 
  1089.  "Test ReadEx-Delete-Writen"){ 
  1090.   INITIALIZER(runBug_11133);
  1091.   FINALIZER(runClearTable);
  1092. }
  1093. NDBT_TESTSUITE_END(testNdbApi);
  1094. int main(int argc, const char** argv){
  1095.   ndb_init();
  1096.   //  TABLE("T1");
  1097.   return testNdbApi.execute(argc, argv);
  1098. }
  1099. template class Vector<Ndb*>;
  1100. template class Vector<NdbConnection*>;