testBasic.cpp
上传用户: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. #include <NDBT_Test.hpp>
  14. #include <NDBT_ReturnCodes.h>
  15. #include <HugoTransactions.hpp>
  16. #include <UtilTransactions.hpp>
  17. #include <NdbRestarter.hpp>
  18. #define GETNDB(ps) ((NDBT_NdbApiStep*)ps)->getNdb()
  19. /**
  20.  * TODO 
  21.  *  dirtyWrite, write, dirtyUpdate
  22.  *  delete should be visible to same transaction
  23.  *  
  24.  */
  25. int runLoadTable2(NDBT_Context* ctx, NDBT_Step* step)
  26. {
  27.   int records = ctx->getNumRecords();
  28.   HugoTransactions hugoTrans(*ctx->getTab());
  29.   if (hugoTrans.loadTable(GETNDB(step), records, 512, false, 0, true) != 0){
  30.     return NDBT_FAILED;
  31.   }
  32.   return NDBT_OK;
  33. }
  34. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step)
  35. {
  36.   int records = ctx->getNumRecords();
  37.   HugoTransactions hugoTrans(*ctx->getTab());
  38.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  39.     return NDBT_FAILED;
  40.   }
  41.   return NDBT_OK;
  42. }
  43. int runInsert(NDBT_Context* ctx, NDBT_Step* step){
  44.   int records = ctx->getNumRecords();
  45.   HugoTransactions hugoTrans(*ctx->getTab());
  46.   // Insert records, dont allow any 
  47.   // errors(except temporary) while inserting
  48.   if (hugoTrans.loadTable(GETNDB(step), records, 1, false) != 0){
  49.     return NDBT_FAILED;
  50.   }
  51.   return NDBT_OK;
  52. }
  53. int runInsertTwice(NDBT_Context* ctx, NDBT_Step* step){
  54.   int records = ctx->getNumRecords();
  55.   HugoTransactions hugoTrans(*ctx->getTab());
  56.   // Insert records, expect primary key violation 630
  57.   if (hugoTrans.loadTable(GETNDB(step), records, 1, false) != 630){
  58.     return NDBT_FAILED;
  59.   }
  60.   return NDBT_OK;
  61. }
  62. int runVerifyInsert(NDBT_Context* ctx, NDBT_Step* step){
  63.   int records = ctx->getNumRecords();
  64.   
  65.   HugoTransactions hugoTrans(*ctx->getTab());
  66.   if (hugoTrans.pkDelRecords(GETNDB(step),  records, 1, false) != 0){
  67.     return NDBT_FAILED;
  68.   }
  69.   return NDBT_OK;
  70. }
  71. int runInsertUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
  72.   int records = ctx->getNumRecords();
  73.   int i = 0;
  74.   HugoTransactions hugoTrans(*ctx->getTab());
  75.   while (ctx->isTestStopped() == false) {
  76.     g_info << i << ": ";    
  77.     if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  78.       g_info << endl;
  79.       return NDBT_FAILED;
  80.     }
  81.     i++;
  82.   }
  83.   g_info << endl;
  84.   return NDBT_OK;
  85. }
  86. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  87.   int records = ctx->getNumRecords();
  88.   int batchSize = ctx->getProperty("BatchSize", 1);
  89.   
  90.   HugoTransactions hugoTrans(*ctx->getTab());
  91.   if (hugoTrans.pkDelRecords(GETNDB(step),  records, batchSize) != 0){
  92.     return NDBT_FAILED;
  93.   }
  94.   return NDBT_OK;
  95. }
  96. int runPkDelete(NDBT_Context* ctx, NDBT_Step* step){
  97.   int loops = ctx->getNumLoops();
  98.   int records = ctx->getNumRecords();
  99.   int i = 0;
  100.   HugoTransactions hugoTrans(*ctx->getTab());
  101.   while (i<loops) {
  102.     g_info << i << ": ";
  103.     if (hugoTrans.pkDelRecords(GETNDB(step),  records) != 0){
  104.       g_info << endl;
  105.       return NDBT_FAILED;
  106.     }
  107.     // Load table, don't allow any primary key violations
  108.     if (hugoTrans.loadTable(GETNDB(step), records, 512, false) != 0){
  109.       g_info << endl;
  110.       return NDBT_FAILED;
  111.     }
  112.     i++;
  113.   }  
  114.   g_info << endl;
  115.   return NDBT_OK;
  116. }
  117. int runPkRead(NDBT_Context* ctx, NDBT_Step* step){
  118.   int loops = ctx->getNumLoops();
  119.   int records = ctx->getNumRecords();
  120.   int batchSize = ctx->getProperty("BatchSize", 1);
  121.   int i = 0;
  122.   HugoTransactions hugoTrans(*ctx->getTab());
  123.   while (i<loops) {
  124.     g_info << i << ": ";
  125.     if (hugoTrans.pkReadRecords(GETNDB(step), records, batchSize) != NDBT_OK){
  126.       g_info << endl;
  127.       return NDBT_FAILED;
  128.     }
  129.     i++;
  130.   }
  131.   g_info << endl;
  132.   return NDBT_OK;
  133. }
  134. int runPkDirtyRead(NDBT_Context* ctx, NDBT_Step* step){
  135.   int loops = ctx->getNumLoops();
  136.   int records = ctx->getNumRecords();
  137.   int batchSize = ctx->getProperty("BatchSize", 1);
  138.   int i = 0;
  139.   bool dirty = true;
  140.   HugoTransactions hugoTrans(*ctx->getTab());
  141.   while (i<loops) {
  142.     g_info << i << ": ";
  143.     if (hugoTrans.pkReadRecords(GETNDB(step), records, batchSize, 
  144. NdbOperation::LM_CommittedRead) != NDBT_OK){
  145.       g_info << endl;
  146.       return NDBT_FAILED;
  147.     }
  148.     i++;
  149.   }
  150.   g_info << endl;
  151.   return NDBT_OK;
  152. }
  153. int runPkReadUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
  154.   int records = ctx->getNumRecords();
  155.   int batchSize = ctx->getProperty("BatchSize", 1);
  156.   int i = 0;
  157.   HugoTransactions hugoTrans(*ctx->getTab());
  158.   while (ctx->isTestStopped() == false) {
  159.     g_info << i << ": ";
  160.     if (hugoTrans.pkReadRecords(GETNDB(step), records, batchSize) != 0){
  161.       g_info << endl;
  162.       return NDBT_FAILED;
  163.     }
  164.     i++;
  165.   }
  166.   g_info << endl;
  167.   return NDBT_OK;
  168. }
  169. int runPkUpdate(NDBT_Context* ctx, NDBT_Step* step){
  170.   int loops = ctx->getNumLoops();
  171.   int records = ctx->getNumRecords();
  172.   int batchSize = ctx->getProperty("BatchSize", 1);
  173.   int i = 0;
  174.   HugoTransactions hugoTrans(*ctx->getTab());
  175.   while (i<loops) {
  176.     g_info << "|- " << i << ": ";
  177.     if (hugoTrans.pkUpdateRecords(GETNDB(step), records, batchSize) != 0){
  178.       g_info << endl;
  179.       return NDBT_FAILED;
  180.     }
  181.     i++;
  182.   }
  183.   g_info << endl;
  184.   return NDBT_OK;
  185. }
  186. int runPkUpdateUntilStopped(NDBT_Context* ctx, NDBT_Step* step){
  187.   int records = ctx->getNumRecords();
  188.   int batchSize = ctx->getProperty("BatchSize", 1);
  189.   int i = 0;
  190.   HugoTransactions hugoTrans(*ctx->getTab());
  191.   while (ctx->isTestStopped()) {
  192.     g_info << i << ": ";
  193.     if (hugoTrans.pkUpdateRecords(GETNDB(step), records, batchSize) != 0){
  194.       g_info << endl;
  195.       return NDBT_FAILED;
  196.     }
  197.     i++;
  198.   }
  199.   g_info << endl;
  200.   return NDBT_OK;
  201. }
  202. int runLocker(NDBT_Context* ctx, NDBT_Step* step){
  203.   int result = NDBT_OK;
  204.   int records = ctx->getNumRecords();
  205.   HugoTransactions hugoTrans(*ctx->getTab());
  206.   
  207.   if (hugoTrans.lockRecords(GETNDB(step), records, 10, 500) != 0){
  208.     result = NDBT_FAILED;
  209.   }
  210.   ctx->stopTest();
  211.   
  212.   return result;
  213. }
  214. int
  215. runInsertOne(NDBT_Context* ctx, NDBT_Step* step){
  216.   
  217.   if(ctx->getProperty("InsertCommitted", (Uint32)0) != 0){
  218.     abort();
  219.   }
  220.   while(ctx->getProperty("Read1Performed", (Uint32)0) == 0){
  221.     NdbSleep_MilliSleep(20);
  222.   }
  223.   
  224.   HugoTransactions hugoTrans(*ctx->getTab());
  225.   
  226.   if (hugoTrans.loadTable(GETNDB(step), 1, 1) != 0){
  227.     return NDBT_FAILED;
  228.   }
  229.   ctx->setProperty("InsertCommitted", 1);
  230.   NdbSleep_SecSleep(2);
  231.   return NDBT_OK;
  232. }
  233. static
  234. int
  235. readOneNoCommit(Ndb* pNdb, NdbConnection* pTrans, 
  236. const NdbDictionary::Table* tab,NDBT_ResultRow * row){
  237.   int a;
  238.   NdbOperation * pOp = pTrans->getNdbOperation(tab->getName());
  239.   if (pOp == NULL){
  240.     ERR(pTrans->getNdbError());
  241.     return NDBT_FAILED;
  242.   }
  243.   
  244.   HugoTransactions tmp(*tab);
  245.   int check = pOp->readTuple();
  246.   if( check == -1 ) {
  247.     ERR(pTrans->getNdbError());
  248.     return NDBT_FAILED;
  249.   }
  250.   
  251.   // Define primary keys
  252.   for(a = 0; a<tab->getNoOfColumns(); a++){
  253.     if (tab->getColumn(a)->getPrimaryKey() == true){
  254.       if(tmp.equalForAttr(pOp, a, 0) != 0){
  255. ERR(pTrans->getNdbError());
  256. return NDBT_FAILED;
  257.       }
  258.     }
  259.   }
  260.   
  261.   // Define attributes to read  
  262.   for(a = 0; a<tab->getNoOfColumns(); a++){
  263.     if((row->attributeStore(a) = 
  264. pOp->getValue(tab->getColumn(a)->getName())) == 0) {
  265.       ERR(pTrans->getNdbError());
  266.       return NDBT_FAILED;
  267.     }
  268.   }
  269.   check = pTrans->execute(NoCommit);     
  270.   if( check == -1 ) {
  271.     const NdbError err = pTrans->getNdbError(); 
  272.     ERR(err);
  273.     return err.code;
  274.   }
  275.   return NDBT_OK;
  276. }
  277. int
  278. runReadOne(NDBT_Context* ctx, NDBT_Step* step){
  279.   Ndb* pNdb = GETNDB(step);
  280.   const NdbDictionary::Table* tab = ctx->getTab();
  281.   NDBT_ResultRow row1(*tab);
  282.   NDBT_ResultRow row2(*tab);  
  283.   if(ctx->getProperty("Read1Performed", (Uint32)0) != 0){
  284.     abort();
  285.   }
  286.   if(ctx->getProperty("InsertCommitted", (Uint32)0) != 0){
  287.     abort();
  288.   }
  289.   
  290.   NdbConnection * pTrans = pNdb->startTransaction();
  291.   if (pTrans == NULL) {
  292.     abort();
  293.   }    
  294.   // Read a record with NoCommit
  295.   // Since the record isn't inserted yet it wil return 626
  296.   const int res1 = readOneNoCommit(pNdb, pTrans, tab, &row1);
  297.   g_info << "|- res1 = " << res1 << endl;
  298.   ctx->setProperty("Read1Performed", 1);
  299.   
  300.   while(ctx->getProperty("InsertCommitted", (Uint32)0) == 0 && 
  301. !ctx->isTestStopped()){
  302.     g_info << "|- Waiting for insert" << endl;
  303.     NdbSleep_MilliSleep(20);
  304.   }
  305.   
  306.   if(ctx->isTestStopped()){
  307.     abort();
  308.   }
  309.   // Now the record should have been inserted
  310.   // Read it once again in the same transaction
  311.   // Should also reutrn 626 if reads are consistent
  312.   // NOTE! Currently it's not possible to start a new operation
  313.   // on a transaction that has returned an error code
  314.   // This is wat fail in this test
  315.   // MASV 20030624
  316.   const int res2 = readOneNoCommit(pNdb, pTrans, tab, &row2);
  317.   pTrans->execute(Commit);
  318.   pNdb->closeTransaction(pTrans);
  319.   g_info << "|- res2 = " << res2 << endl;
  320.   if (res2 == 626 && res1 == res2)    
  321.     return NDBT_OK;
  322.   else
  323.     return NDBT_FAILED;
  324. }
  325. int runFillTable(NDBT_Context* ctx, NDBT_Step* step){
  326.   int batch = 512; //4096;
  327.   HugoTransactions hugoTrans(*ctx->getTab());
  328.   if (hugoTrans.fillTable(GETNDB(step), batch ) != 0){
  329.     return NDBT_FAILED;
  330.   }
  331.   return NDBT_OK;
  332. }
  333. int runClearTable2(NDBT_Context* ctx, NDBT_Step* step){
  334.   int records = ctx->getNumRecords();
  335.   
  336.   UtilTransactions utilTrans(*ctx->getTab());
  337.   if (utilTrans.clearTable2(GETNDB(step), records, 240) != 0){
  338.     return NDBT_FAILED;
  339.   }
  340.   return NDBT_OK;
  341. }
  342. #define CHECK(b) if (!(b)) { 
  343.   ndbout << "ERR: "<< step->getName() 
  344.          << " failed on line " << __LINE__ << endl; 
  345.   result = NDBT_FAILED; 
  346.   break; }
  347. int runNoCommitSleep(NDBT_Context* ctx, NDBT_Step* step){
  348.   int result = NDBT_OK;
  349.   HugoOperations hugoOps(*ctx->getTab());
  350.   Ndb* pNdb = GETNDB(step);
  351.   int sleepTime = 100; // ms
  352.   for (int i = 2; i < 8; i++){
  353.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  354.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  355.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  356.     ndbout << i <<": Sleeping for " << sleepTime << " ms" << endl;
  357.     NdbSleep_MilliSleep(sleepTime);
  358.     // Dont care about result of these ops
  359.     hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive);
  360.     hugoOps.closeTransaction(pNdb);
  361.     sleepTime = sleepTime *i;
  362.   }
  363.   hugoOps.closeTransaction(pNdb);
  364.   return result;
  365. }
  366. int runCommit626(NDBT_Context* ctx, NDBT_Step* step){
  367.   int result = NDBT_OK;
  368.   HugoOperations hugoOps(*ctx->getTab());
  369.   Ndb* pNdb = GETNDB(step);
  370.   do{
  371.     // Commit transaction
  372.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  373.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  374.     CHECK(hugoOps.execute_Commit(pNdb) == 626);
  375.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  376.     // Commit transaction
  377.     // Multiple operations
  378.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  379.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  380.     CHECK(hugoOps.pkReadRecord(pNdb, 2, 1, NdbOperation::LM_Exclusive) == 0);
  381.     CHECK(hugoOps.pkReadRecord(pNdb, 3, 1, NdbOperation::LM_Exclusive) == 0);
  382.     CHECK(hugoOps.execute_Commit(pNdb) == 626);
  383.   }while(false);
  384.   hugoOps.closeTransaction(pNdb);
  385.   
  386.   return result;
  387. }
  388. int runCommit630(NDBT_Context* ctx, NDBT_Step* step){
  389.   int result = NDBT_OK;
  390.   HugoOperations hugoOps(*ctx->getTab());
  391.   Ndb* pNdb = GETNDB(step);
  392.   do{
  393.     // Commit transaction
  394.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  395.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  396.     CHECK(hugoOps.execute_Commit(pNdb) == 630);
  397.   }while(false);
  398.   hugoOps.closeTransaction(pNdb);
  399.   return result;
  400. }
  401. int runCommit_TryCommit626(NDBT_Context* ctx, NDBT_Step* step){
  402.   int result = NDBT_OK;
  403.   HugoOperations hugoOps(*ctx->getTab());
  404.   Ndb* pNdb = GETNDB(step);
  405.   do{
  406.     // Commit transaction, TryCommit
  407.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  408.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  409.     CHECK(hugoOps.execute_Commit(pNdb, TryCommit) == 626);
  410.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  411.     // Commit transaction, TryCommit
  412.     // Several operations in one transaction
  413.     // The insert is OK
  414.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  415.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  416.     CHECK(hugoOps.pkReadRecord(pNdb, 2, 1, NdbOperation::LM_Exclusive) == 0);
  417.     CHECK(hugoOps.pkReadRecord(pNdb, 3, 1, NdbOperation::LM_Exclusive) == 0);
  418.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  419.     CHECK(hugoOps.pkReadRecord(pNdb, 4, 1, NdbOperation::LM_Exclusive) == 0);
  420.     CHECK(hugoOps.execute_Commit(pNdb, TryCommit) == 626);
  421.   }while(false);
  422.   hugoOps.closeTransaction(pNdb);
  423.   return result;
  424. }
  425. int runCommit_TryCommit630(NDBT_Context* ctx, NDBT_Step* step){
  426.   int result = NDBT_OK;
  427.   HugoOperations hugoOps(*ctx->getTab());
  428.   Ndb* pNdb = GETNDB(step);
  429.   
  430.   do{
  431.     // Commit transaction, TryCommit
  432.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  433.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  434.     CHECK(hugoOps.execute_Commit(pNdb, TryCommit) == 630);
  435.   }while(false);
  436.   
  437.   hugoOps.closeTransaction(pNdb);
  438.   
  439.   return result;
  440. }
  441. int runCommit_CommitAsMuchAsPossible626(NDBT_Context* ctx, NDBT_Step* step){
  442.   int result = NDBT_OK;
  443.   HugoOperations hugoOps(*ctx->getTab());
  444.   Ndb* pNdb = GETNDB(step);
  445.   do{
  446.     // Commit transaction, CommitAsMuchAsPossible
  447.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  448.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  449.     CHECK(hugoOps.execute_Commit(pNdb, CommitAsMuchAsPossible) == 626);
  450.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  451.     // Commit transaction, CommitAsMuchAsPossible
  452.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  453.     CHECK(hugoOps.pkReadRecord(pNdb, 2, 1, NdbOperation::LM_Exclusive) == 0);
  454.     CHECK(hugoOps.pkReadRecord(pNdb, 3, 1, NdbOperation::LM_Exclusive) == 0);
  455.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  456.     CHECK(hugoOps.execute_Commit(pNdb, CommitAsMuchAsPossible) == 626);
  457.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  458.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  459.     CHECK(hugoOps.pkReadRecord(pNdb, 1) == 0);
  460.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  461.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  462.   } while(false);
  463.   hugoOps.closeTransaction(pNdb);
  464.   return result;
  465. }
  466. int runCommit_CommitAsMuchAsPossible630(NDBT_Context* ctx, NDBT_Step* step){
  467.   int result = NDBT_OK;
  468.   HugoOperations hugoOps(*ctx->getTab());
  469.   Ndb* pNdb = GETNDB(step);
  470.   do{
  471.     // Commit transaction, CommitAsMuchAsPossible
  472.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  473.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  474.     CHECK(hugoOps.pkDeleteRecord(pNdb, 2) == 0);
  475.     CHECK(hugoOps.execute_Commit(pNdb, CommitAsMuchAsPossible) == 630);
  476.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  477.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  478.     CHECK(hugoOps.pkReadRecord(pNdb, 2) == 0);
  479.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  480.   } while(false);
  481.   hugoOps.closeTransaction(pNdb);
  482.   
  483.   return result;
  484. }
  485. int runNoCommit626(NDBT_Context* ctx, NDBT_Step* step){
  486.   int result = NDBT_OK;
  487.   HugoOperations hugoOps(*ctx->getTab());
  488.   Ndb* pNdb = GETNDB(step);
  489.   do{
  490.     // No commit transaction, readTuple
  491.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  492.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Read) == 0);
  493.     CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  494.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  495.     // No commit transaction, readTupleExcluive
  496.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  497.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  498.     CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  499.   }while(false);
  500.   hugoOps.closeTransaction(pNdb);
  501.   
  502.   return result;
  503. }
  504. int runNoCommit630(NDBT_Context* ctx, NDBT_Step* step){
  505.   int result = NDBT_OK;
  506.   HugoOperations hugoOps(*ctx->getTab());
  507.   Ndb* pNdb = GETNDB(step);
  508.   do{
  509.     // No commit transaction
  510.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  511.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  512.     CHECK(hugoOps.execute_NoCommit(pNdb) == 630);
  513.   }while(false);
  514.   hugoOps.closeTransaction(pNdb);
  515.   
  516.   return result;
  517. }
  518. int runNoCommitRollback626(NDBT_Context* ctx, NDBT_Step* step){
  519.   int result = NDBT_OK;
  520.   HugoOperations hugoOps(*ctx->getTab());
  521.   Ndb* pNdb = GETNDB(step);
  522.   do{
  523.     // No commit transaction, rollback
  524.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  525.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  526.     CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  527.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  528.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  529.     // No commit transaction, rollback
  530.     // Multiple operations
  531.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  532.     CHECK(hugoOps.pkReadRecord(pNdb, 1, 1, NdbOperation::LM_Exclusive) == 0);
  533.     CHECK(hugoOps.pkReadRecord(pNdb, 2, 1, NdbOperation::LM_Exclusive) == 0);
  534.     CHECK(hugoOps.pkReadRecord(pNdb, 3, 1, NdbOperation::LM_Exclusive) == 0);
  535.     CHECK(hugoOps.pkReadRecord(pNdb, 4, 1, NdbOperation::LM_Exclusive) == 0);
  536.     CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  537.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  538.   }while(false);
  539.   hugoOps.closeTransaction(pNdb);
  540.   
  541.   return result;
  542. }
  543. int runNoCommitRollback630(NDBT_Context* ctx, NDBT_Step* step){
  544.   int result = NDBT_OK;
  545.   HugoOperations hugoOps(*ctx->getTab());
  546.   Ndb* pNdb = GETNDB(step);
  547.   do{
  548.     // No commit transaction, rollback
  549.     CHECK(hugoOps.startTransaction(pNdb) == 0);
  550.     CHECK(hugoOps.pkInsertRecord(pNdb, 1) == 0);
  551.     CHECK(hugoOps.execute_NoCommit(pNdb) == 630);
  552.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  553.   }while(false);
  554.   hugoOps.closeTransaction(pNdb);
  555.   return result;
  556. }
  557. int runNoCommitAndClose(NDBT_Context* ctx, NDBT_Step* step){
  558.   int i, result = NDBT_OK;
  559.   HugoOperations hugoOps(*ctx->getTab());
  560.   Ndb* pNdb = GETNDB(step);
  561.   do{
  562.     // Read 
  563.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  564.     for (i = 0; i < 10; i++)
  565.       CHECK(hugoOps.pkReadRecord(pNdb, i, 1, NdbOperation::LM_Exclusive) == 0);
  566.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  567.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  568.   
  569.     // Update
  570.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  571.     for (i = 0; i < 10; i++)
  572.       CHECK(hugoOps.pkUpdateRecord(pNdb, i) == 0);
  573.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  574.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  575.   
  576.     // Delete
  577.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  578.     for (i = 0; i < 10; i++)
  579.       CHECK(hugoOps.pkDeleteRecord(pNdb, i) == 0);
  580.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  581.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  582.     // Try to insert, record should already exist
  583.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  584.     for (i = 0; i < 10; i++)
  585.       CHECK(hugoOps.pkInsertRecord(pNdb, i) == 0);
  586.     CHECK(hugoOps.execute_Commit(pNdb) == 630);
  587.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  588.   }while(false);
  589.   hugoOps.closeTransaction(pNdb);
  590.   return result;
  591. }
  592. int runCheckRollbackDelete(NDBT_Context* ctx, NDBT_Step* step){
  593.   int result = NDBT_OK;
  594.   HugoOperations hugoOps(*ctx->getTab());
  595.   Ndb* pNdb = GETNDB(step);
  596.   do{
  597.     // Read value and save it for later
  598.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  599.     CHECK(hugoOps.pkReadRecord(pNdb, 5) == 0);
  600.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  601.     CHECK(hugoOps.saveCopyOfRecord() == NDBT_OK);
  602.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  603.     // Delete record 5
  604.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  605.     CHECK(hugoOps.pkDeleteRecord(pNdb, 5) == 0);
  606.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  607.     // Check record is deleted
  608.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 1, NdbOperation::LM_Exclusive) == 0);
  609.     CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  610.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  611.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  612.     // Check record is not deleted
  613.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  614.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 1, NdbOperation::LM_Exclusive) == 0);
  615.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  616.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  617.     // Check record is back to original value
  618.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  619.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 1, NdbOperation::LM_Exclusive) == 0);
  620.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  621.     CHECK(hugoOps.compareRecordToCopy() == NDBT_OK);
  622.   }while(false);
  623.   hugoOps.closeTransaction(pNdb);
  624.   return result;
  625. }
  626. int runCheckRollbackUpdate(NDBT_Context* ctx, NDBT_Step* step){
  627.   int result = NDBT_OK;
  628.   HugoOperations hugoOps(*ctx->getTab());
  629.   Ndb* pNdb = GETNDB(step);
  630.   int numRecords = 5;
  631.   do{
  632.     
  633.     // Read value and save it for later
  634.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  635.     CHECK(hugoOps.pkReadRecord(pNdb, 1, numRecords) == 0);
  636.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  637.     CHECK(hugoOps.verifyUpdatesValue(0) == NDBT_OK); // Update value 0
  638.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  639.     // Update  record 5
  640.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  641.     CHECK(hugoOps.pkUpdateRecord(pNdb, 1, numRecords, 5) == 0);// Updates value 5
  642.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  643.   
  644.     // Check record is updated
  645.     CHECK(hugoOps.pkReadRecord(pNdb, 1, numRecords, NdbOperation::LM_Exclusive) == 0);
  646.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  647.     CHECK(hugoOps.verifyUpdatesValue(5) == NDBT_OK); // Updates value 5
  648.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  649.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  650.     // Check record is back to original value
  651.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  652.     CHECK(hugoOps.pkReadRecord(pNdb, 1, numRecords, NdbOperation::LM_Exclusive) == 0);
  653.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  654.     CHECK(hugoOps.verifyUpdatesValue(0) == NDBT_OK); // Updates value 0
  655.   }while(false);
  656.   hugoOps.closeTransaction(pNdb);
  657.   return result;
  658. }
  659. int runCheckRollbackDeleteMultiple(NDBT_Context* ctx, NDBT_Step* step){
  660.   int result = NDBT_OK;
  661.   HugoOperations hugoOps(*ctx->getTab());
  662.   Ndb* pNdb = GETNDB(step);
  663.   do{
  664.     // Read value and save it for later
  665.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  666.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 10) == 0);
  667.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  668.     CHECK(hugoOps.verifyUpdatesValue(0) == NDBT_OK);
  669.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  670.     
  671.     Uint32 updatesValue = 0;
  672.     Uint32 j;
  673.     for(Uint32 i = 0; i<1; i++){
  674.       // Read  record 5 - 10
  675.       CHECK(hugoOps.startTransaction(pNdb) == 0);  
  676.       CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  677.       CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  678.       
  679.       for(j = 0; j<10; j++){
  680. // Update  record 5 - 10
  681. updatesValue++;
  682. CHECK(hugoOps.pkUpdateRecord(pNdb, 5, 10, updatesValue) == 0);
  683. CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  684. CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  685. CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  686. CHECK(hugoOps.verifyUpdatesValue(updatesValue) == 0);
  687.       }      
  688.       
  689.       for(j = 0; j<10; j++){
  690. // Delete record 5 - 10 times
  691. CHECK(hugoOps.pkDeleteRecord(pNdb, 5, 10) == 0);
  692. CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  693. #if 0
  694. // Check records are deleted
  695. CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  696. CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  697. #endif
  698. updatesValue++;
  699. CHECK(hugoOps.pkInsertRecord(pNdb, 5, 10, updatesValue) == 0);
  700. CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  701. CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  702. CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  703. CHECK(hugoOps.verifyUpdatesValue(updatesValue) == 0);
  704.       }
  705.       CHECK(hugoOps.pkDeleteRecord(pNdb, 5, 10) == 0);
  706.       CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  707.       // Check records are deleted
  708.       CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  709.       CHECK(hugoOps.execute_NoCommit(pNdb) == 626);
  710.       CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  711.       
  712.       CHECK(hugoOps.closeTransaction(pNdb) == 0);
  713.     }
  714.     
  715.     // Check records are not deleted
  716.     // after rollback
  717.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  718.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  719.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  720.     CHECK(hugoOps.verifyUpdatesValue(0) == NDBT_OK);
  721.     
  722.   }while(false);
  723.   hugoOps.closeTransaction(pNdb);
  724.   return result;
  725. }
  726. int runCheckImplicitRollbackDelete(NDBT_Context* ctx, NDBT_Step* step){
  727.   int result = NDBT_OK;
  728.   HugoOperations hugoOps(*ctx->getTab());
  729.   Ndb* pNdb = GETNDB(step);
  730.   do{
  731.     // Read  record 5
  732.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  733.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 1, NdbOperation::LM_Exclusive) == 0);
  734.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  735.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  736.     
  737.     // Update  record 5
  738.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  739.     CHECK(hugoOps.pkUpdateRecord(pNdb, 5) == 0);
  740.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  741.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  742.   
  743.     // Delete record 5
  744.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  745.     CHECK(hugoOps.pkDeleteRecord(pNdb, 5) == 0);
  746.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  747.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  748.     // Check record is not deleted
  749.     // Close transaction should have rollbacked
  750.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  751.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 1, NdbOperation::LM_Exclusive) == 0);
  752.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  753.   }while(false);
  754.   hugoOps.closeTransaction(pNdb);
  755.   return result;
  756. }
  757. int runCheckCommitDelete(NDBT_Context* ctx, NDBT_Step* step){
  758.   int result = NDBT_OK;
  759.   HugoOperations hugoOps(*ctx->getTab());
  760.   Ndb* pNdb = GETNDB(step);
  761.   do{
  762.     // Read  10 records
  763.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  764.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  765.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  766.   
  767.     // Update 10 records
  768.     CHECK(hugoOps.pkUpdateRecord(pNdb, 5, 10) == 0);
  769.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  770.   
  771.     // Delete 10 records
  772.     CHECK(hugoOps.pkDeleteRecord(pNdb, 5, 10) == 0);
  773.     CHECK(hugoOps.execute_NoCommit(pNdb) == 0);
  774.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  775.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  776.     // Check record's are deleted
  777.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  778.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  779.     CHECK(hugoOps.execute_Commit(pNdb) == 626);
  780.   }while(false);
  781.   hugoOps.closeTransaction(pNdb);
  782.   return result;
  783. }
  784. int runRollbackNothing(NDBT_Context* ctx, NDBT_Step* step){
  785.   int result = NDBT_OK;
  786.   HugoOperations hugoOps(*ctx->getTab());
  787.   Ndb* pNdb = GETNDB(step);
  788.   do{
  789.     // Delete record 5 - 15
  790.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  791.     CHECK(hugoOps.pkDeleteRecord(pNdb, 5, 10) == 0);
  792.     // Rollback 
  793.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  794.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  795.     // Check records are not deleted
  796.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  797.     CHECK(hugoOps.pkReadRecord(pNdb, 5, 10, NdbOperation::LM_Exclusive) == 0);
  798.     CHECK(hugoOps.execute_Commit(pNdb) == 0);
  799.     CHECK(hugoOps.closeTransaction(pNdb) == 0);  
  800.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  801.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  802.   }while(false);
  803.   hugoOps.closeTransaction(pNdb);
  804.   return result;
  805. }
  806. int runMassiveRollback(NDBT_Context* ctx, NDBT_Step* step){
  807.   NdbRestarter restarter;
  808.   const int records = 4 * restarter.getNumDbNodes();
  809.   HugoTransactions hugoTrans(*ctx->getTab());
  810.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  811.     return NDBT_FAILED;
  812.   }
  813.   
  814.   int result = NDBT_OK;
  815.   HugoOperations hugoOps(*ctx->getTab());
  816.   Ndb* pNdb = GETNDB(step);
  817.   const Uint32 OPS_PER_TRANS = 256;
  818.   const Uint32 OPS_TOTAL = 4096;
  819.   for(int row = 0; row < records; row++){
  820.     int res;
  821.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  822.     for(Uint32 i = 0; i<OPS_TOTAL; i += OPS_PER_TRANS){
  823.       for(Uint32 j = 0; j<OPS_PER_TRANS; j++){
  824. CHECK(hugoOps.pkUpdateRecord(pNdb, row, 1, i) == 0);
  825.       }
  826.       g_info << "Performed " << (i+OPS_PER_TRANS) << " updates on row: " << row
  827.      << endl;
  828.       if(result != NDBT_OK){
  829. break;
  830.       }
  831.       res = hugoOps.execute_NoCommit(pNdb);
  832.       if(res != 0){
  833. NdbError err = pNdb->getNdbError(res);
  834. CHECK(err.classification == NdbError::TimeoutExpired);
  835. break;
  836.       }
  837.     }
  838.     if(result != NDBT_OK){
  839.       break;
  840.     }
  841.     g_info << "executeRollback" << endl;
  842.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  843.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  844.   }
  845.   
  846.   hugoOps.closeTransaction(pNdb);
  847.   return result;
  848. }
  849. int
  850. runMassiveRollback2(NDBT_Context* ctx, NDBT_Step* step){
  851.   HugoTransactions hugoTrans(*ctx->getTab());
  852.   if (hugoTrans.loadTable(GETNDB(step), 1) != 0){
  853.     return NDBT_FAILED;
  854.   }
  855.   int result = NDBT_OK;
  856.   HugoOperations hugoOps(*ctx->getTab());
  857.   Ndb* pNdb = GETNDB(step);
  858.   const Uint32 OPS_TOTAL = 4096;
  859.   const Uint32 LOOPS = 10;
  860.   
  861.   for(Uint32 loop = 0; loop<LOOPS; loop++){
  862.     CHECK(hugoOps.startTransaction(pNdb) == 0);  
  863.     for(Uint32 i = 0; i<OPS_TOTAL-1; i ++){
  864.       if((i & 1) == 0){
  865. CHECK(hugoOps.pkUpdateRecord(pNdb, 0, 1, loop) == 0);
  866.       } else {
  867. CHECK(hugoOps.pkUpdateRecord(pNdb, 1, 1, loop) == 0);
  868.       }
  869.     }
  870.     CHECK(hugoOps.execute_Commit(pNdb) == 626);
  871.     CHECK(hugoOps.execute_Rollback(pNdb) == 0);
  872.     CHECK(hugoOps.closeTransaction(pNdb) == 0);
  873.   }
  874.   
  875.   hugoOps.closeTransaction(pNdb);
  876.   return result;
  877. }
  878. NDBT_TESTSUITE(testBasic);
  879. TESTCASE("PkInsert", 
  880.  "Verify that we can insert and delete from this table using PK"
  881.  "NOTE! No errors are allowed!" ){
  882.   INITIALIZER(runInsert);
  883.   VERIFIER(runVerifyInsert);
  884. }
  885. TESTCASE("PkRead", 
  886.    "Verify that we can insert, read and delete from this table using PK"){
  887.   INITIALIZER(runLoadTable);
  888.   STEP(runPkRead);
  889.   FINALIZER(runClearTable);
  890. }
  891. TESTCASE("PkDirtyRead", 
  892.  "Verify that we can insert, dirty read and delete from this table using PK"){
  893.   INITIALIZER(runLoadTable);
  894.   STEP(runPkDirtyRead);
  895.   FINALIZER(runClearTable);
  896. }
  897. TESTCASE("PkUpdate", 
  898.    "Verify that we can insert, update and delete from this table using PK"){
  899.   INITIALIZER(runLoadTable);
  900.   STEP(runPkUpdate);
  901.   FINALIZER(runClearTable);
  902. }
  903. TESTCASE("PkDelete", 
  904.  "Verify that we can delete from this table using PK"){
  905.   INITIALIZER(runLoadTable);
  906.   STEP(runPkDelete);
  907.   FINALIZER(runClearTable);
  908. }
  909. TESTCASE("UpdateAndRead", 
  910.  "Verify that we can read and update at the same time"){
  911.   INITIALIZER(runLoadTable);
  912.   STEP(runPkRead);
  913.   STEP(runPkRead);
  914.   STEP(runPkRead);
  915.   STEP(runPkUpdate);  
  916.   STEP(runPkUpdate);
  917.   STEP(runPkUpdate);
  918.   FINALIZER(runClearTable);
  919. }
  920. TESTCASE("PkReadAndLocker", 
  921.  "Verify that we can read although there are "
  922.  " a number of 1 second locks in the table"){
  923.   INITIALIZER(runLoadTable);
  924.   STEP(runPkReadUntilStopped);
  925.   STEP(runLocker);
  926.   FINALIZER(runClearTable);
  927. }
  928. TESTCASE("PkReadAndLocker2", 
  929.  "Verify that we can read and update although there are "
  930.  " a number of 1 second locks in the table"){
  931.   INITIALIZER(runLoadTable);
  932.   STEP(runPkReadUntilStopped);
  933.   STEP(runPkReadUntilStopped);
  934.   STEP(runPkReadUntilStopped);
  935.   STEP(runPkReadUntilStopped);
  936.   STEP(runPkReadUntilStopped);
  937.   STEP(runPkReadUntilStopped);
  938.   STEP(runLocker);
  939.   FINALIZER(runClearTable);
  940. }
  941. TESTCASE("PkReadUpdateAndLocker", 
  942.  "Verify that we can read and update although there are "
  943.  " a number of 1 second locks in the table"){
  944.   INITIALIZER(runLoadTable);
  945.   STEP(runPkReadUntilStopped);
  946.   STEP(runPkReadUntilStopped);
  947.   STEP(runPkUpdateUntilStopped);
  948.   STEP(runPkUpdateUntilStopped);
  949.   STEP(runLocker);
  950.   FINALIZER(runClearTable);
  951. }
  952. TESTCASE("ReadWithLocksAndInserts", 
  953.  "TR457: This test is added to verify that an insert of a records "
  954.  "that is already in the database does not delete the record"){  
  955.   INITIALIZER(runLoadTable);
  956.   STEP(runPkReadUntilStopped);
  957.   STEP(runPkReadUntilStopped);
  958.   STEP(runLocker);
  959.   STEP(runInsertUntilStopped);
  960.   FINALIZER(runClearTable);
  961. }
  962. TESTCASE("PkInsertTwice", 
  963.  "Verify that we can't insert an already inserted record."
  964.  "Error should be returned" ){
  965.   INITIALIZER(runLoadTable);
  966.   STEP(runInsertTwice);
  967.   FINALIZER(runClearTable);
  968. }
  969. TESTCASE("NoCommitSleep", 
  970.  "Verify what happens when a NoCommit transaction is aborted by "
  971.  "NDB because the application is sleeping" ){
  972.   INITIALIZER(runLoadTable);
  973.   INITIALIZER(runNoCommitSleep);
  974.   FINALIZER(runClearTable2);
  975. }
  976. TESTCASE("Commit626", 
  977.  "Verify what happens when a Commit transaction is aborted by "
  978.  "NDB because the record does no exist" ){
  979.   INITIALIZER(runClearTable2);
  980.   INITIALIZER(runCommit626);
  981.   FINALIZER(runClearTable2);
  982. }
  983. TESTCASE("CommitTry626", 
  984.  "Verify what happens when a Commit(TryCommit) n"
  985.  "transaction is aborted by "
  986.  "NDB because the record does no exist" ){
  987.   INITIALIZER(runClearTable2);
  988.   INITIALIZER(runCommit_TryCommit626);
  989.   FINALIZER(runClearTable2);
  990. }
  991. TESTCASE("CommitAsMuch626", 
  992.  "Verify what happens when a Commit(CommitAsMuchAsPossible) n"
  993.  "transaction is aborted byn"
  994.  "NDB because the record does no exist" ){
  995.   INITIALIZER(runClearTable2);
  996.   INITIALIZER(runCommit_CommitAsMuchAsPossible626);
  997.   FINALIZER(runClearTable2);
  998. }
  999. TESTCASE("NoCommit626", 
  1000.  "Verify what happens when a NoCommit transaction is aborted by "
  1001.  "NDB because the record does no exist" ){
  1002.   INITIALIZER(runClearTable2);
  1003.   INITIALIZER(runNoCommit626);
  1004.   FINALIZER(runClearTable2);
  1005. }
  1006. TESTCASE("NoCommitRollback626", 
  1007.  "Verify what happens when a NoCommit transaction is aborted by "
  1008.  "NDB because the record does no exist and then we try to rollbackn"
  1009.  "the transaction" ){
  1010.   INITIALIZER(runClearTable2);
  1011.   INITIALIZER(runNoCommitRollback626);
  1012.   FINALIZER(runClearTable2);
  1013. }
  1014. TESTCASE("Commit630", 
  1015.  "Verify what happens when a Commit transaction is aborted by "
  1016.  "NDB because the record already exist" ){
  1017.   INITIALIZER(runLoadTable);
  1018.   INITIALIZER(runCommit630);
  1019.   FINALIZER(runClearTable2);
  1020. }
  1021. TESTCASE("CommitTry630", 
  1022.  "Verify what happens when a Commit(TryCommit) n"
  1023.  "transaction is aborted by "
  1024.  "NDB because the record already exist" ){
  1025.   INITIALIZER(runLoadTable);
  1026.   INITIALIZER(runCommit_TryCommit630);
  1027.   FINALIZER(runClearTable2);
  1028. }
  1029. TESTCASE("CommitAsMuch630", 
  1030.  "Verify what happens when a Commit(CommitAsMuchAsPossible) n"
  1031.  "transaction is aborted byn"
  1032.  "NDB because the record already exist" ){
  1033.   INITIALIZER(runLoadTable);
  1034.   INITIALIZER(runCommit_CommitAsMuchAsPossible630);
  1035.   FINALIZER(runClearTable2);
  1036. }
  1037. TESTCASE("NoCommit630", 
  1038.  "Verify what happens when a NoCommit transaction is aborted by "
  1039.  "NDB because the record already exist" ){
  1040.   INITIALIZER(runLoadTable);
  1041.   INITIALIZER(runNoCommit630);
  1042.   FINALIZER(runClearTable2);
  1043. }
  1044. TESTCASE("NoCommitRollback630", 
  1045.  "Verify what happens when a NoCommit transaction is aborted by "
  1046.  "NDB because the record already exist and then we try to rollbackn"
  1047.  "the transaction" ){
  1048.   INITIALIZER(runLoadTable);
  1049.   INITIALIZER(runNoCommitRollback630);
  1050.   FINALIZER(runClearTable2);
  1051. }
  1052. TESTCASE("NoCommitAndClose", 
  1053.  "Verify what happens when a NoCommit transaction is closed "
  1054.  "without rolling back the transaction " ){
  1055.   INITIALIZER(runLoadTable);
  1056.   INITIALIZER(runNoCommitAndClose);
  1057.   FINALIZER(runClearTable2);
  1058. }
  1059. TESTCASE("RollbackDelete", 
  1060.  "Test rollback of a no committed delete"){
  1061.   INITIALIZER(runLoadTable);
  1062.   INITIALIZER(runCheckRollbackDelete);
  1063.   FINALIZER(runClearTable2);
  1064. }
  1065. TESTCASE("RollbackUpdate", 
  1066.  "Test rollback of a no committed update"){
  1067.   INITIALIZER(runLoadTable);
  1068.   INITIALIZER(runCheckRollbackUpdate);
  1069.   FINALIZER(runClearTable2);
  1070. }
  1071. TESTCASE("RollbackDeleteMultiple", 
  1072.  "Test rollback of 10 non committed delete"){
  1073.   INITIALIZER(runLoadTable);
  1074.   INITIALIZER(runCheckRollbackDeleteMultiple);
  1075.   FINALIZER(runClearTable2);
  1076. }
  1077. TESTCASE("ImplicitRollbackDelete", 
  1078.  "Test close transaction after a no commited deleten"
  1079.  "this would give an implicit rollback of the deleten"){
  1080.   INITIALIZER(runLoadTable);
  1081.   INITIALIZER(runCheckImplicitRollbackDelete);
  1082.   FINALIZER(runClearTable2);
  1083. }
  1084. TESTCASE("CommitDelete", 
  1085.  "Test close transaction after a no commited deleten"
  1086.  "this would give an implicit rollback of the deleten"){
  1087.   INITIALIZER(runLoadTable);
  1088.   INITIALIZER(runCheckCommitDelete);
  1089.   FINALIZER(runClearTable2);
  1090. }
  1091. TESTCASE("RollbackNothing", 
  1092.  "Test rollback of nothing"){
  1093.   INITIALIZER(runLoadTable);
  1094.   INITIALIZER(runRollbackNothing);
  1095.   FINALIZER(runClearTable2);
  1096. }
  1097. TESTCASE("MassiveRollback", 
  1098.  "Test rollback of 4096 operations"){
  1099.   INITIALIZER(runClearTable2);
  1100.   INITIALIZER(runMassiveRollback);
  1101.   FINALIZER(runClearTable2);
  1102. }
  1103. TESTCASE("MassiveRollback2", 
  1104.  "Test rollback of 4096 operations"){
  1105.   INITIALIZER(runClearTable2);
  1106.   INITIALIZER(runMassiveRollback2);
  1107.   FINALIZER(runClearTable2);
  1108. }
  1109. TESTCASE("MassiveTransaction",
  1110.          "Test very large insert transaction"){
  1111.   INITIALIZER(runLoadTable2);
  1112.   FINALIZER(runClearTable2);
  1113. }
  1114. TESTCASE("Fill", 
  1115.  "Verify what happens when we fill the db" ){
  1116.   INITIALIZER(runFillTable);
  1117.   INITIALIZER(runPkRead);
  1118.   FINALIZER(runClearTable2);
  1119. }
  1120. NDBT_TESTSUITE_END(testBasic);
  1121. #if 0
  1122. TESTCASE("ReadConsistency",
  1123.  "Check that a read within a transaction returns the " 
  1124.  "same result no matter"){
  1125.   STEP(runInsertOne);
  1126.   STEP(runReadOne);
  1127.   FINALIZER(runClearTable2);
  1128. }
  1129. #endif
  1130. int main(int argc, const char** argv){
  1131.   ndb_init();
  1132.   return testBasic.execute(argc, argv);
  1133. }