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

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. #include <Vector.hpp>
  19. #include "ScanFilter.hpp"
  20. #include "ScanInterpretTest.hpp"
  21. int runLoadTable(NDBT_Context* ctx, NDBT_Step* step){
  22.   int records = ctx->getNumRecords();
  23.   HugoTransactions hugoTrans(*ctx->getTab());
  24.   if (hugoTrans.loadTable(GETNDB(step), records) != 0){
  25.     return NDBT_FAILED;
  26.   }
  27.   return NDBT_OK;
  28. }
  29. int runClearTable(NDBT_Context* ctx, NDBT_Step* step){
  30.   int records = ctx->getNumRecords();
  31.   
  32.   UtilTransactions utilTrans(*ctx->getTab());
  33.   if (utilTrans.clearTable2(GETNDB(step),  records) != 0){
  34.     return NDBT_FAILED;
  35.   }
  36.   return NDBT_OK;
  37. }
  38. int runClearResTable(NDBT_Context* ctx, NDBT_Step* step){
  39.   int records = ctx->getNumRecords();
  40.   const NdbDictionary::Table* pResTab = 
  41.     GETNDB(step)->getDictionary()->getTable(ctx->getProperty("ResultTabName", "NULL"));
  42.   
  43.   UtilTransactions utilTrans(*pResTab);
  44.   if (utilTrans.clearTable2(GETNDB(step), records) != 0){
  45.     return NDBT_FAILED;
  46.   }
  47.   return NDBT_OK;
  48. }
  49. int runScanRead(NDBT_Context* ctx, NDBT_Step* step){
  50.   int loops = ctx->getNumLoops();
  51.   int records = ctx->getNumRecords();
  52.   int parallelism = ctx->getProperty("Parallelism", 1);
  53.   
  54.   int i = 0;
  55.   HugoTransactions hugoTrans(*ctx->getTab());
  56.   while (i<loops) {
  57.     g_info << i << ": ";
  58.     if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, parallelism) != 0){
  59.       return NDBT_FAILED;
  60.     }
  61.     i++;
  62.   }
  63.   return NDBT_OK;
  64. }
  65. int runScanReadResTable(NDBT_Context* ctx, NDBT_Step* step){
  66.   int records = ctx->getNumRecords();
  67.   int parallelism = ctx->getProperty("Parallelism", 1);
  68.   const NdbDictionary::Table* pResTab = 
  69.     NDBT_Table::discoverTableFromDb(GETNDB(step), 
  70.     ctx->getProperty("ResultTabName", "NULL"));
  71.   
  72.   HugoTransactions hugoTrans(*pResTab);
  73.   if (hugoTrans.scanReadRecords(GETNDB(step), records, 0, parallelism) != 0){
  74.     return NDBT_FAILED;
  75.   }
  76.   return NDBT_OK;
  77. }
  78. int runCreateResultTable(NDBT_Context* ctx, NDBT_Step* step){
  79.   const NdbDictionary::Table* pTab = ctx->getTab();
  80.   char newTabName[256];
  81.   BaseString::snprintf(newTabName, 256, "%s_RES", pTab->getName());
  82.   ctx->setProperty("ResultTabName", newTabName);
  83.   NdbDictionary::Table resTab(* pTab);
  84.   resTab.setName(newTabName);
  85.   
  86.   if (GETNDB(step)->getDictionary()->createTable(resTab) != 0){
  87.     g_err << newTabName << " creation failed!"<< endl;
  88.     return NDBT_FAILED;
  89.   }else{
  90.     g_info << newTabName << " created!"<< endl;
  91.     return NDBT_OK;
  92.   }
  93. }
  94. int scanWithFilter(NDBT_Context* ctx, NDBT_Step* step, ScanFilter& filt){
  95.   int records = ctx->getNumRecords();
  96.   const char* resTabName = ctx->getProperty("ResultTabName", "NULL");
  97.   if (strcmp(resTabName, "NULL") == 0)
  98.     return NDBT_FAILED;
  99.   const NdbDictionary::Table* pTab = ctx->getTab();
  100.   const NdbDictionary::Table* pResTab = NDBT_Table::discoverTableFromDb(GETNDB(step), resTabName);
  101.   if (pResTab == NULL)
  102.     return NDBT_FAILED;
  103.   
  104.   ScanInterpretTest interpretTest(*pTab, *pResTab);
  105.   if (interpretTest.scanRead(GETNDB(step), 
  106.      records, 
  107.      16, 
  108.      filt) != 0){
  109.     return NDBT_FAILED;
  110.   }
  111.   return NDBT_OK;
  112. }
  113. int runScanLessThan(NDBT_Context* ctx, NDBT_Step* step){
  114.   int records = ctx->getNumRecords();
  115.   LessThanFilter filt(records);
  116.   return scanWithFilter(ctx, step, filt);
  117. }
  118. int runScanEqual(NDBT_Context* ctx, NDBT_Step* step){
  119.   EqualFilter filt;
  120.   return scanWithFilter(ctx, step, filt);
  121. }
  122. int scanVerifyWithFilter(NDBT_Context* ctx, NDBT_Step* step, ScanFilter& filt){
  123.   int records = ctx->getNumRecords();
  124.   const char* resTabName = ctx->getProperty("ResultTabName", "NULL");
  125.   if (strcmp(resTabName, "NULL") == 0)
  126.     return NDBT_FAILED;
  127.   const NdbDictionary::Table* pTab = ctx->getTab();
  128.   const NdbDictionary::Table* pResTab = NDBT_Table::discoverTableFromDb(GETNDB(step), resTabName);
  129.   if (pResTab == NULL)
  130.     return NDBT_FAILED;
  131.   
  132.   ScanInterpretTest interpretTest(*pTab, *pResTab);
  133.   if (interpretTest.scanReadVerify(GETNDB(step), 
  134.    records, 
  135.    16, 
  136.    filt) != NDBT_OK){
  137.     return NDBT_FAILED;
  138.   }
  139.   return NDBT_OK;
  140. }
  141. int runScanLessThanVerify(NDBT_Context* ctx, NDBT_Step* step){
  142.   int records = ctx->getNumRecords();
  143.   LessThanFilter filt(records);
  144.   return scanVerifyWithFilter(ctx, step, filt);
  145. }
  146. int runScanEqualVerify(NDBT_Context* ctx, NDBT_Step* step){
  147.   EqualFilter filt;
  148.   return scanVerifyWithFilter(ctx, step, filt);
  149. }
  150. int runScanEqualLoop(NDBT_Context* ctx, NDBT_Step* step){
  151.   int loops = ctx->getNumLoops();
  152.   int l = 0;
  153.   EqualFilter filt;
  154.   while(l < loops){
  155.     if (scanWithFilter(ctx, step, filt) != NDBT_OK)
  156.       return NDBT_FAILED;
  157.     if (runClearResTable(ctx, step) != NDBT_OK)
  158.       return NDBT_FAILED;
  159.     l++;
  160.   }
  161.   return NDBT_OK;
  162. }
  163. int runScanEqualVerifyLoop(NDBT_Context* ctx, NDBT_Step* step){
  164.   int loops = ctx->getNumLoops();
  165.   int l = 0;
  166.   EqualFilter filt;
  167.   while(l < loops){
  168.     if (scanWithFilter(ctx, step, filt) != NDBT_OK)
  169.       return NDBT_FAILED;
  170.     if (scanVerifyWithFilter(ctx, step, filt) != NDBT_OK)
  171.       return NDBT_FAILED;
  172.     if (runClearResTable(ctx, step) != NDBT_OK)
  173.       return NDBT_FAILED;
  174.     l++;
  175.   }
  176.   return NDBT_OK;
  177. }
  178. int runScanLessThanLoop(NDBT_Context* ctx, NDBT_Step* step){
  179.   int loops = ctx->getNumLoops();
  180.   int records = ctx->getNumRecords();
  181.   int l = 0;
  182.   LessThanFilter filt(records);
  183.   while(l < loops){
  184.     if (scanWithFilter(ctx, step, filt) != NDBT_OK)
  185.       return NDBT_FAILED;
  186.     if (runClearResTable(ctx, step) != NDBT_OK)
  187.       return NDBT_FAILED;
  188.     l++;
  189.   }
  190.   return NDBT_OK;
  191. }
  192. NDBT_TESTSUITE(testScanInterpreter);
  193. TESTCASE("ScanLessThan", 
  194.  "Read all records in table TX with attrX less "
  195.  "than a value and store the resultset in TX_RES."
  196.  "Then compare records in TX_RES with records in TX."){
  197.   //  TABLE("T1");
  198.   //  TABLE("T2");
  199.   INITIALIZER(runLoadTable);
  200.   INITIALIZER(runCreateResultTable);
  201.   STEP(runScanLessThan);
  202.   VERIFIER(runScanLessThanVerify);
  203.   FINALIZER(runClearTable);
  204.   FINALIZER(runClearResTable);
  205. }
  206. TESTCASE("ScanEqual", 
  207.  "Read all records in table TX with attrX equal "
  208.  "to a value and store the resultset in TX_RES."
  209.  "Then compare records in TX_RES with records in TX."){
  210.   //  TABLE("T1");
  211.   //  TABLE("T2");
  212.   INITIALIZER(runLoadTable);
  213.   INITIALIZER(runCreateResultTable);
  214.   STEP(runScanEqual);
  215.   VERIFIER(runScanEqualVerify);
  216.   FINALIZER(runClearTable);
  217.   FINALIZER(runClearResTable);
  218. }
  219. TESTCASE("ScanEqualLoop", 
  220.  "Scan all records in TX equal to a value."
  221.  "Do this loop number of times"){
  222.   //  TABLE("T1");
  223.   //  TABLE("T2");
  224.   INITIALIZER(runLoadTable);
  225.   INITIALIZER(runCreateResultTable);
  226.   STEP(runScanEqualLoop);
  227.   FINALIZER(runClearTable);
  228.   FINALIZER(runClearResTable);
  229. }
  230. TESTCASE("ScanEqualVerifyLoop", 
  231.  "Scan all records in TX equal to a value."
  232.  "Verify record in TX_RES table"
  233.  "Do this loop number of times"){
  234.   //  TABLE("T1");
  235.   //  TABLE("T2");
  236.   INITIALIZER(runLoadTable);
  237.   INITIALIZER(runCreateResultTable);
  238.   STEP(runScanEqualVerifyLoop);
  239.   FINALIZER(runClearTable);
  240.   FINALIZER(runClearResTable);
  241. }
  242. TESTCASE("ScanLessThanLoop", 
  243.  "Scan all records in TX less than a value."
  244.  "Do this loop number of times"){
  245.   //  TABLE("T1");
  246.   //  TABLE("T2");
  247.   INITIALIZER(runLoadTable);
  248.   INITIALIZER(runCreateResultTable);
  249.   STEP(runScanLessThanLoop);
  250.   FINALIZER(runClearTable);
  251.   FINALIZER(runClearResTable);
  252. }
  253. NDBT_TESTSUITE_END(testScanInterpreter);
  254. int main(int argc, const char** argv){
  255.   ndb_init();
  256.   return testScanInterpreter.execute(argc, argv);
  257. }