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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #ifndef SCAN_INTERPRET_TEST_HPP
  14. #define SCAN_INTERPRET_TEST_HPP
  15. #include "ScanFilter.hpp"
  16. class ScanInterpretTest {
  17. public:
  18.   ScanInterpretTest(const NdbDictionary::Table& _tab, 
  19.     const NdbDictionary::Table& _restab) : 
  20.     tab(_tab),
  21.     restab(_restab),
  22.     row(_tab){
  23.   }
  24.   int scanRead(Ndb*, 
  25.        int records,
  26.        int parallelism,
  27.        ScanFilter& filter);
  28.   int scanReadVerify(Ndb*, 
  29.      int records,
  30.      int parallelism,
  31.      ScanFilter& filter);
  32.   int addRowToInsert(Ndb* pNdb, 
  33.      NdbConnection* pInsTrans);
  34.   int addRowToCheckTrans(Ndb* pNdb, 
  35.  NdbConnection* pCheckTrans);
  36. private:
  37.   const NdbDictionary::Table& tab;
  38.   const NdbDictionary::Table& restab;
  39.   NDBT_ResultRow row;
  40.   
  41. };
  42. inline
  43. int 
  44. ScanInterpretTest::addRowToInsert(Ndb* pNdb, 
  45.   NdbConnection* pInsTrans){
  46.   NdbOperation* pOp = 
  47.     pInsTrans->getNdbOperation(restab.getName());
  48.   if (pOp == NULL) {
  49.     ERR(pInsTrans->getNdbError());
  50.     pNdb->closeTransaction(pInsTrans);
  51.     return NDBT_FAILED;
  52.   }
  53.   
  54.   if( pOp->insertTuple() == -1 ) {
  55.     ERR(pInsTrans->getNdbError());
  56.     pNdb->closeTransaction(pInsTrans);
  57.     return NDBT_FAILED;
  58.   }
  59.   
  60.   // Copy all attribute to the new operation
  61.   for (int a = 0; a<restab.getNoOfColumns(); a++){
  62.     const NdbDictionary::Column* attr = tab.getColumn(a); 
  63.     NdbRecAttr* reca = row.attributeStore(a);
  64.     int check = -1;
  65.     switch (attr->getType()){
  66.     case NdbDictionary::Column::Char:
  67.     case NdbDictionary::Column::Varchar:
  68.     case NdbDictionary::Column::Binary:
  69.     case NdbDictionary::Column::Varbinary:{
  70.       check = pOp->setValue( attr->getName(), 
  71.      reca->aRef());
  72.       break;
  73.     }
  74.     case NdbDictionary::Column::Int:{
  75.       check = pOp->setValue( attr->getName(), 
  76.      reca->int32_value());      
  77.     }
  78.       break;
  79.     case NdbDictionary::Column::Bigint:{
  80.       check = pOp->setValue( attr->getName(), 
  81.      reca->int64_value());
  82.     }
  83.       break;
  84.     case NdbDictionary::Column::Unsigned:{
  85.       check = pOp->setValue( attr->getName(), 
  86.      reca->u_32_value());
  87.     }
  88.       break;
  89.     case NdbDictionary::Column::Bigunsigned:{
  90.       check = pOp->setValue( attr->getName(), 
  91.      reca->u_64_value());
  92.     }
  93.       break;
  94.     case NdbDictionary::Column::Float:
  95.       check = pOp->setValue( attr->getName(), 
  96.      reca->float_value());
  97.       break;
  98.     default:
  99.       check = -1;
  100.       break;
  101.     }
  102.     if(check != 0){
  103.       ERR(pInsTrans->getNdbError());
  104.       pNdb->closeTransaction(pInsTrans);
  105.       return NDBT_FAILED;
  106.     }
  107.   }
  108.   
  109.   return NDBT_OK;
  110. }
  111. inline
  112. int 
  113. ScanInterpretTest::addRowToCheckTrans(Ndb* pNdb, 
  114.       NdbConnection* pCheckTrans){
  115.   NdbOperation* pOp = 
  116.     pCheckTrans->getNdbOperation(restab.getName());
  117.   if (pOp == NULL) {
  118.     ERR(pNdb->getNdbError());
  119.     return NDBT_FAILED;
  120.   }
  121.   
  122.   if(pOp->readTuple() != 0) {
  123.     ERR(pNdb->getNdbError());
  124.     return NDBT_FAILED;
  125.   }
  126.   
  127.   // Copy pk attribute's to the new operation
  128.   for (int a = 0; a<restab.getNoOfColumns(); a++){
  129.     const NdbDictionary::Column* attr = restab.getColumn(a); 
  130.     if (attr->getPrimaryKey() == true){
  131.       NdbRecAttr* reca = row.attributeStore(a);
  132.       int check = -1;
  133.       switch (attr->getType()){
  134.       case NdbDictionary::Column::Char:
  135.       case NdbDictionary::Column::Varchar:
  136.       case NdbDictionary::Column::Binary:
  137.       case NdbDictionary::Column::Varbinary:{
  138. check = pOp->equal( attr->getName(), 
  139.        reca->aRef());
  140. break;
  141.       }
  142.       case NdbDictionary::Column::Int:{
  143. check = pOp->equal( attr->getName(), 
  144.        reca->int32_value());      
  145.       }
  146. break;
  147.       case NdbDictionary::Column::Bigint:{
  148. check = pOp->equal( attr->getName(), 
  149.        reca->int64_value());
  150.       }
  151. break;
  152.       case NdbDictionary::Column::Unsigned:{
  153. check = pOp->equal( attr->getName(), 
  154.        reca->u_32_value());
  155.       }
  156. break;
  157.       case NdbDictionary::Column::Bigunsigned:{
  158. check = pOp->equal( attr->getName(), 
  159.        reca->u_64_value());
  160.       }
  161. break;
  162.       default:
  163. check = -1;
  164. break;
  165.       }
  166.       if(check != 0){
  167. ERR(pNdb->getNdbError());
  168. return NDBT_FAILED;
  169.       }
  170.     }
  171.   }
  172.   return NDBT_OK;
  173. }
  174. inline
  175. int 
  176. ScanInterpretTest::scanRead(Ndb* pNdb,
  177.     int records,
  178.     int parallelism,
  179.     ScanFilter& filter){
  180.   int                  retryAttempt = 0;
  181.   int            retryMax = 100;
  182.   int                  check;
  183.   NdbConnection        *pTrans;
  184.   NdbScanOperation        *pOp;
  185.   while (true){
  186.     if (retryAttempt >= retryMax){
  187.       ndbout << "ERROR: has retried this operation " << retryAttempt 
  188.      << " times, failing!" << endl;
  189.       return NDBT_FAILED;
  190.     }
  191.     pTrans = pNdb->startTransaction();
  192.     if (pTrans == NULL) {
  193.       const NdbError err = pNdb->getNdbError();
  194.       if (err.status == NdbError::TemporaryError){
  195. ERR(err);
  196. NdbSleep_MilliSleep(50);
  197. retryAttempt++;
  198. continue;
  199.       }
  200.       ERR(err);
  201.       return NDBT_FAILED;
  202.     }
  203.     
  204.     pOp = pTrans->getNdbScanOperation(tab.getName());
  205.     if (pOp == NULL) {
  206.       ERR(pTrans->getNdbError());
  207.       pNdb->closeTransaction(pTrans);
  208.       return NDBT_FAILED;
  209.     }
  210.    
  211.     NdbResultSet * rs = pOp->readTuples(NdbScanOperation::LM_Read, 
  212.                                         0, parallelism);
  213.  
  214.     if( rs == 0 ) {
  215.       ERR(pTrans->getNdbError());
  216.       pNdb->closeTransaction(pTrans);
  217.       return NDBT_FAILED;
  218.     }
  219.     if (filter.filterOp(pOp) != 0){
  220.       ERR(pTrans->getNdbError());
  221.       pNdb->closeTransaction(pTrans);
  222.       return NDBT_FAILED;
  223.     }
  224.     
  225.     // Read all attributes  
  226.     for(int a = 0; a<tab.getNoOfColumns(); a++){
  227.       if((row.attributeStore(a) = 
  228.   pOp->getValue(tab.getColumn(a)->getName())) == 0) {
  229. ERR(pTrans->getNdbError());
  230. pNdb->closeTransaction(pTrans);
  231. return NDBT_FAILED;
  232.       }
  233.     }      
  234.     check = pTrans->execute(NoCommit);   
  235.     if( check == -1 ) {
  236.       ERR(pTrans->getNdbError());
  237.       pNdb->closeTransaction(pTrans);
  238.       return NDBT_FAILED;
  239.     }
  240.     int eof;
  241.     int rows = 0;
  242.     NdbConnection* pInsTrans;
  243.     while((eof = rs->nextResult(true)) == 0){
  244.       do {
  245. rows++;
  246. if (addRowToInsert(pNdb, pTrans) != 0){
  247.   pNdb->closeTransaction(pTrans);
  248.   return NDBT_FAILED;
  249. }
  250.       } while((eof = rs->nextResult(false)) == 0);
  251.       
  252.       check = pTrans->execute(Commit);   
  253.       if( check == -1 ) {
  254. const NdbError err = pTrans->getNdbError();    
  255. ERR(err);
  256. pNdb->closeTransaction(pTrans);
  257. return NDBT_FAILED;
  258.       }
  259.     }
  260.     if (eof == -1) {
  261.       const NdbError err = pTrans->getNdbError();
  262.       if (err.status == NdbError::TemporaryError){
  263. ERR(err);
  264. pNdb->closeTransaction(pTrans);
  265. NdbSleep_MilliSleep(50);
  266. retryAttempt++;
  267. continue;
  268.       }
  269.       ERR(err);
  270.       pNdb->closeTransaction(pTrans);
  271.       return NDBT_FAILED;
  272.     }
  273.     
  274.     pNdb->closeTransaction(pTrans);
  275.     g_info << rows << " rows have been scanned" << endl;
  276.     
  277.     return NDBT_OK;
  278.   }
  279.   return NDBT_FAILED;
  280. }
  281. inline
  282. int 
  283. ScanInterpretTest::scanReadVerify(Ndb* pNdb,
  284.   int records,
  285.   int parallelism,
  286.   ScanFilter& filter){
  287.   int                  retryAttempt = 0;
  288.   const int            retryMax = 100;
  289.   int                  check;
  290.   NdbConnection        *pTrans;
  291.   NdbScanOperation        *pOp;
  292.   
  293.   while (true){
  294.     
  295.     if (retryAttempt >= retryMax){
  296.       ndbout << "ERROR: has retried this operation " << retryAttempt 
  297.      << " times, failing!" << endl;
  298.       return NDBT_FAILED;
  299.     }
  300.     
  301.     pTrans = pNdb->startTransaction();
  302.     if (pTrans == NULL) {
  303.       const NdbError err = pNdb->getNdbError();
  304.       if (err.status == NdbError::TemporaryError){
  305. ERR(err);
  306. NdbSleep_MilliSleep(50);
  307. retryAttempt++;
  308. continue;
  309.       }
  310.       ERR(err);
  311.       return NDBT_FAILED;
  312.     }
  313.     
  314.     
  315.     pOp = pTrans->getNdbScanOperation(tab.getName());
  316.     if (pOp == NULL) {  if (pOp->getValue("KOL2") == 0){
  317.     ERR(pNdb->getNdbError());
  318.     return NDBT_FAILED;
  319.   }
  320.   
  321.       ERR(pTrans->getNdbError());
  322.       pNdb->closeTransaction(pTrans);
  323.       return NDBT_FAILED;
  324.     }
  325.    
  326.     NdbResultSet * rs = pOp->readTuples(NdbScanOperation::LM_Read,
  327.                                         0, parallelism); 
  328.     if( rs == 0 ) {
  329.       ERR(pTrans->getNdbError());
  330.       pNdb->closeTransaction(pTrans);
  331.       return NDBT_FAILED;
  332.     }
  333.     check = pOp->interpret_exit_ok();
  334.     if (check == -1) {
  335.       ERR(pTrans->getNdbError());
  336.       pNdb->closeTransaction(pTrans);
  337.       return NDBT_FAILED;
  338.     }
  339.     
  340.     // Read all attributes  
  341.     for(int a = 0; a<tab.getNoOfColumns(); a++){
  342.       if((row.attributeStore(a) = 
  343.   pOp->getValue(tab.getColumn(a)->getName())) == 0) {
  344. ERR(pTrans->getNdbError());
  345. pNdb->closeTransaction(pTrans);
  346. return NDBT_FAILED;
  347.       }
  348.     }      
  349.     check = pTrans->execute(NoCommit);   
  350.     if( check == -1 ) {
  351.       ERR(pTrans->getNdbError());
  352.       pNdb->closeTransaction(pTrans);
  353.       return NDBT_FAILED;
  354.     }
  355.     int eof;
  356.     int rows = 0;
  357.     int rowsNoExist = 0;
  358.     int rowsExist = 0;    
  359.     int existingRecordsNotFound = 0;
  360.     int nonExistingRecordsFound = 0;
  361.     NdbConnection* pExistTrans;
  362.     NdbConnection* pNoExistTrans;
  363.     
  364.     while((eof = rs->nextResult(true)) == 0){
  365.       pExistTrans = pNdb->startTransaction();
  366.       if (pExistTrans == NULL) {
  367. const NdbError err = pNdb->getNdbError();
  368. ERR(err);
  369. return NDBT_FAILED;
  370.       }
  371.       pNoExistTrans = pNdb->startTransaction();
  372.       if (pNoExistTrans == NULL) {
  373. const NdbError err = pNdb->getNdbError();
  374. ERR(err);
  375. return NDBT_FAILED;
  376.       }
  377.       do {
  378. rows++;
  379. if (filter.verifyRecord(row) == NDBT_OK){
  380.   rowsExist++;
  381.   if (addRowToCheckTrans(pNdb, pExistTrans) != 0){
  382.     pNdb->closeTransaction(pTrans);
  383.     pNdb->closeTransaction(pExistTrans);
  384.     pNdb->closeTransaction(pNoExistTrans);
  385.     return NDBT_FAILED;
  386.   }
  387. }else{
  388.   rowsNoExist++;
  389.   if (addRowToCheckTrans(pNdb, pNoExistTrans) != 0){
  390.     pNdb->closeTransaction(pTrans);
  391.     pNdb->closeTransaction(pExistTrans);
  392.     pNdb->closeTransaction(pNoExistTrans);
  393.     return NDBT_FAILED;
  394.   }
  395. }
  396.       } while((eof = rs->nextResult(false)) == 0);
  397.       // Execute the transaction containing reads of 
  398.       // all the records that should be in the result table
  399.       check = pExistTrans->execute(Commit);   
  400.       if( check == -1 ) {
  401. const NdbError err = pExistTrans->getNdbError();    
  402. ERR(err);
  403. if (err.code != 626){
  404.   pNdb->closeTransaction(pExistTrans);
  405.   pNdb->closeTransaction(pNoExistTrans);
  406.   pNdb->closeTransaction(pTrans);
  407.   return NDBT_FAILED;
  408. }else{
  409.   // Some of the records expected to be found wasn't 
  410.   // there
  411.   existingRecordsNotFound = 1;
  412. }
  413.       }
  414.       pNdb->closeTransaction(pExistTrans);
  415.       // Execute the transaction containing reads of 
  416.       // all the records that should NOT be in the result table
  417.       check = pNoExistTrans->execute(Commit, CommitAsMuchAsPossible);   
  418.       if( check == -1 ) {
  419. const NdbError err = pNoExistTrans->getNdbError();    
  420. // The transactions error code should be zero
  421. if (err.code != 626){
  422.   ERR(err);
  423.   pNdb->closeTransaction(pNoExistTrans);
  424.   pNdb->closeTransaction(pTrans);
  425.   return NDBT_FAILED;
  426. }
  427. // Loop through the no existing transaction and check that no 
  428. // operations where successful
  429. const NdbOperation* pOp2 = NULL;
  430. while ((pOp2 = pNoExistTrans->getNextCompletedOperation(pOp2)) != NULL){
  431.   const NdbError err = pOp2->getNdbError();
  432.   if (err.code != 626){
  433.     ndbout << "err.code = " << err.code<< endl;
  434.     nonExistingRecordsFound = 1;
  435.   }
  436. }
  437.       } 
  438.       
  439.       pNdb->closeTransaction(pNoExistTrans);
  440.       
  441.     }
  442.     if (eof == -1) {
  443.       const NdbError err = pTrans->getNdbError();
  444.       
  445.       if (err.status == NdbError::TemporaryError){
  446. ERR(err);
  447. pNdb->closeTransaction(pTrans);
  448. NdbSleep_MilliSleep(50);
  449. retryAttempt++;
  450. continue;
  451.       }
  452.       ERR(err);
  453.       pNdb->closeTransaction(pTrans);
  454.       return NDBT_FAILED;
  455.     }
  456.     
  457.     int testResult = NDBT_OK;
  458.     int rowsResult = 0;
  459.     UtilTransactions utilTrans(restab);  
  460.     if (utilTrans.selectCount(pNdb, 
  461.       240,
  462.       &rowsResult) != 0){
  463.       return NDBT_FAILED;
  464.     }
  465.     if (existingRecordsNotFound == 1){
  466.       ndbout << "!!! Expected records not found" << endl;
  467.       testResult = NDBT_FAILED;
  468.     }
  469.     if (nonExistingRecordsFound == 1){
  470.       ndbout << "!!! Unxpected records found" << endl;
  471.       testResult = NDBT_FAILED;
  472.     }
  473.     ndbout << rows << " rows scanned("
  474.    << rowsExist << " found, " << rowsResult<<" expected)" << endl;
  475.     if (rowsResult != rowsExist){
  476.       ndbout << "!!! Number of rows in result table different from expected" << endl;
  477.       testResult = NDBT_FAILED;
  478.     }
  479.     return testResult;
  480.   }
  481.   return NDBT_FAILED;
  482. }
  483. #endif