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

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2003 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /* ***************************************************
  14.        INDEX TEST 1
  15.        Test index functionality of NDB
  16.        Arguments:
  17.         -T create table
  18.         -L include a long attribute in key or index
  19.         -2 define primary key with two attributes
  20.         -c create index
  21. -p make index unique (include primary key attribute)
  22.         -r read using index
  23. -u update using index
  24. -d delete using index
  25. -n<no operations> do n operations (for -I -r -u -d -R -U -D)
  26. -o<no parallel operations> (for -I -r -u -d -R -U -D)
  27. -m<no indexes>
  28.        Returns:
  29.         0 - Test passed
  30.        -1 - Test failed
  31.         1 - Invalid arguments
  32.  * *************************************************** */
  33. #include <ndb_global.h>
  34. #include <NdbApi.hpp>
  35. #include <NdbOut.hpp>
  36. #include <NdbTick.h>
  37. #include <NdbMain.h>
  38. #include <NdbTest.hpp>
  39. #include <NDBT_Error.hpp>
  40. #ifndef MIN
  41. #define MIN(x,y) (((x)<(y))?(x):(y))
  42. #endif
  43. #define MAX_NO_PARALLEL_OPERATIONS 100
  44. bool testPassed = true;
  45. static void
  46. error_handler(const char* errorText)
  47. {
  48.   // Test failed 
  49.   ndbout << endl << "ErrorMessage: " << errorText << endl;
  50.   testPassed = false;
  51. }
  52. static void
  53. error_handler4(int line, int status, int classif, int errNo, const char* errorText)
  54. {
  55.   ndbout << endl << "Line " << line << endl;
  56.   // Test failed 
  57.   ndbout << "Status " << status << ", Classification " << classif<< ", Error code " << errNo << "n" << errorText << endl;
  58.   testPassed = false;
  59. }
  60. static char *longName, *sixtysix, *ninetynine, *hundred;
  61. static void createTable(Ndb &myNdb, bool storeInACC, bool twoKey, bool longKey)
  62. {
  63.   NdbDictionary::Dictionary* dict = myNdb.getDictionary();
  64.   NdbDictionary::Table table("THE_TABLE");
  65.   NdbDictionary::Column column;
  66.   int res;
  67.   column.setName("X");
  68.   column.setType(NdbDictionary::Column::Unsigned);
  69.   column.setLength(1);
  70.   column.setPrimaryKey(true);
  71.   column.setNullable(false);
  72.   table.addColumn(column);
  73.   column.setName("Y");
  74.   column.setType(NdbDictionary::Column::Unsigned);
  75.   column.setLength(1);
  76.   column.setPrimaryKey(false);
  77.   column.setNullable(false);
  78.   table.addColumn(column);
  79.   if ((res = dict->createTable(table)) == -1) {
  80.     error_handler(dict->getNdbError().message);
  81.   }
  82.   else
  83.       ndbout << "Created table" << ((longKey)?" with long key":"") <<endl;
  84. }
  85. static void createIndex(Ndb &myNdb, bool includePrimary, unsigned int noOfIndexes)
  86. {
  87.   Uint64 before, after;
  88.   NdbDictionary::Dictionary* dict = myNdb.getDictionary();
  89.   char indexName[] = "INDEX0000";
  90.   int res;
  91.   for(unsigned int indexNum = 0; indexNum < noOfIndexes; indexNum++) {
  92.     sprintf(indexName, "INDEX%.4u", indexNum);
  93.     NdbDictionary::Index index(indexName);
  94.     index.setTable("THE_TABLE");
  95.     index.setType(NdbDictionary::Index::UniqueHashIndex);
  96.     if (includePrimary) {
  97.       const char* attr_arr[] = {"X", "Y"};
  98.       index.addIndexColumns(2, attr_arr);
  99.     }
  100.     else {
  101.       const char* attr_arr[] = {"Y"};
  102.       index.addIndexColumns(2, attr_arr);
  103.     }
  104.     before = NdbTick_CurrentMillisecond();
  105.     if ((res = dict->createIndex(index)) == -1) {
  106.       error_handler(dict->getNdbError().message);
  107.     }    
  108.     after = NdbTick_CurrentMillisecond();
  109.     ndbout << "Created index " << indexName << ", " << after - before << " msec"<< endl;
  110.   }
  111. }
  112.   
  113. static void insertTable(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool oneTrans, bool twoKey, bool longKey)
  114. {
  115.   Uint64 tbefore, tafter, before, after;
  116.   NdbConnection  *myTrans;  
  117.   NdbOperation   *myOp;   
  118.   
  119.   tbefore = NdbTick_CurrentMillisecond();
  120.   if (oneTrans) myTrans = myNdb.startTransaction();
  121.   for (unsigned int i = 0; i<noOfTuples; i++) {
  122.     if (!oneTrans) myTrans = myNdb.startTransaction();
  123.     for(unsigned int j = 1; 
  124. ((j<=noOfOperations)&&(i<noOfTuples)); 
  125. (++j<=noOfOperations)?i++:i) { 
  126.       if (myTrans == NULL) 
  127. error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  128.        myNdb.getNdbError().code, myNdb.getNdbError().message);
  129.       
  130.       myOp = myTrans->getNdbOperation("THE_TABLE"); 
  131.       if (myOp == NULL) 
  132. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  133.        myTrans->getNdbError().code, myTrans->getNdbError().message);
  134.       
  135.       myOp->insertTuple();
  136.       if (myOp->equal("X", i) == -1) {
  137. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  138.        myTrans->getNdbError().code, myTrans->getNdbError().message);
  139. myNdb.closeTransaction(myTrans);
  140. break;
  141.       }      
  142.       if (myOp->setValue("Y", i+1) == -1) {
  143. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  144.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  145. myNdb.closeTransaction(myTrans);
  146. break;
  147.       }      
  148.     }
  149.     before = NdbTick_CurrentMillisecond();
  150.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  151.       {
  152.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  153.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  154.         myNdb.closeTransaction(myTrans);
  155.         break;
  156.       }
  157.     after = NdbTick_CurrentMillisecond();
  158.     if (noOfOperations == 1)
  159.       printf("Inserted 1 tuple, %u msecn", (Uint32) after - before);
  160.     else
  161.       printf("Inserted %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  162.     if (!oneTrans) myNdb.closeTransaction(myTrans);
  163.   }
  164.   if (oneTrans) {
  165.     if (myTrans->execute( Commit ) == -1) {
  166.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  167.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  168.     }
  169.     myNdb.closeTransaction(myTrans);
  170.   }
  171.   tafter = NdbTick_CurrentMillisecond();
  172.   ndbout << "Inserted "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  173. }
  174.  
  175. static void updateTable(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool oneTrans, bool twoKey, bool longKey)
  176. {
  177.   Uint64 tbefore, tafter, before, after;
  178.   NdbConnection  *myTrans;  
  179.   NdbOperation   *myOp;   
  180.   
  181.   tbefore = NdbTick_CurrentMillisecond();
  182.   if (oneTrans) myTrans = myNdb.startTransaction();
  183.   for (unsigned int i = 0; i<noOfTuples; i++) {
  184.     if (!oneTrans) myTrans = myNdb.startTransaction();
  185.     for(unsigned int j = 1; 
  186. ((j<=noOfOperations)&&(i<noOfTuples)); 
  187. (++j<=noOfOperations)?i++:i) { 
  188.       if (myTrans == NULL) 
  189. error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  190.        myNdb.getNdbError().code, myNdb.getNdbError().message);
  191.       
  192.       myOp = myTrans->getNdbOperation("THE_TABLE"); 
  193.       if (myOp == NULL) 
  194. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  195.        myTrans->getNdbError().code, myTrans->getNdbError().message);
  196.       
  197.       myOp->updateTuple();
  198.       if (myOp->equal("X", i) == -1) {
  199. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  200.        myTrans->getNdbError().code, myTrans->getNdbError().message);
  201. myNdb.closeTransaction(myTrans);
  202. break;
  203.       }      
  204.       if (myOp->setValue("Y", i+2) == -1) {
  205. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  206.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  207. myNdb.closeTransaction(myTrans);
  208. break;
  209.       }      
  210.     }
  211.     before = NdbTick_CurrentMillisecond();
  212.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  213.       {
  214. error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  215.        myTrans->getNdbError().code, myTrans->getNdbError().message);
  216. myNdb.closeTransaction(myTrans);
  217. break;
  218.       }
  219.       after = NdbTick_CurrentMillisecond();
  220.       if (noOfOperations == 1)
  221. printf("Updated 1 tuple, %u msecn", (Uint32) after - before);
  222.       else
  223. printf("Update %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  224.       if (!oneTrans) myNdb.closeTransaction(myTrans);
  225.   }    
  226.   if (oneTrans) {
  227.     if (myTrans->execute( Commit ) == -1) {
  228.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  229.      myTrans->getNdbError().code, myTrans->getNdbError().message);
  230.     }
  231.     myNdb.closeTransaction(myTrans);
  232.   }
  233.   tafter = NdbTick_CurrentMillisecond();
  234.   
  235.   ndbout << "Updated "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  236. }
  237. static void deleteTable(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool oneTrans, bool twoKey, bool longKey)
  238. {
  239.   Uint64 tbefore, tafter, before, after;
  240.   NdbConnection  *myTrans;  
  241.   NdbOperation   *myOp;   
  242.   
  243.   tbefore = NdbTick_CurrentMillisecond();
  244.   if (oneTrans) myTrans = myNdb.startTransaction();
  245.   for (unsigned int i = 0; i<noOfTuples; i++) {
  246.     if (!oneTrans) myTrans = myNdb.startTransaction();
  247.     for(unsigned int j = 1; 
  248. ((j<=noOfOperations)&&(i<noOfTuples)); 
  249. (++j<=noOfOperations)?i++:i) { 
  250.       if (myTrans == NULL) 
  251.         error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  252.                        myNdb.getNdbError().code, myNdb.getNdbError().message);
  253.       
  254.       myOp = myTrans->getNdbOperation("THE_TABLE"); 
  255.       if (myOp == NULL) 
  256.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  257.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  258.       
  259.       myOp->deleteTuple();
  260.       if (myOp->equal("X", i) == -1) {
  261.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  262.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  263.         myNdb.closeTransaction(myTrans);
  264.         break;
  265.       }      
  266.     before = NdbTick_CurrentMillisecond();
  267.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  268.       {
  269.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  270.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  271.         myNdb.closeTransaction(myTrans);
  272.         break;
  273.       }
  274.     }
  275.     after = NdbTick_CurrentMillisecond();
  276.     if (noOfOperations == 1)
  277.       printf("Deleted 1 tuple, %u msecn", (Uint32) after - before);
  278.     else
  279.       printf("Deleted %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  280.     
  281.     if (!oneTrans) myNdb.closeTransaction(myTrans);
  282.   }
  283.   if (oneTrans) {
  284.     if (myTrans->execute( Commit ) == -1) {
  285.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  286.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  287.     }
  288.     myNdb.closeTransaction(myTrans);
  289.   }
  290.   tafter = NdbTick_CurrentMillisecond();
  291.   ndbout << "Deleted "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  292. }
  293. static void readTable(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool oneTrans, bool twoKey, bool longKey)
  294. {
  295.   Uint64 tbefore, tafter, before, after;
  296.   NdbConnection  *myTrans;  
  297.   NdbOperation   *myOp;   
  298.   NdbRecAttr* myRecAttrArr[MAX_NO_PARALLEL_OPERATIONS];
  299.   
  300.   tbefore = NdbTick_CurrentMillisecond();
  301.   if (oneTrans) myTrans = myNdb.startTransaction();
  302.   for (unsigned int i = 0; i<noOfTuples; i++) {
  303.     if (!oneTrans) myTrans = myNdb.startTransaction();
  304.     for(unsigned int j = 1; 
  305. ((j<=noOfOperations)&&(i<noOfTuples)); 
  306. (++j<=noOfOperations)?i++:i) { 
  307.       if (myTrans == NULL) 
  308.         error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  309.                        myNdb.getNdbError().code, myNdb.getNdbError().message);
  310.       
  311.       myOp = myTrans->getNdbOperation("THE_TABLE"); 
  312.       if (myOp == NULL) 
  313.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  314.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  315.       
  316.       myOp->readTuple();
  317.       if (myOp->equal("X", i) == -1) {
  318.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  319.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  320.         myNdb.closeTransaction(myTrans);
  321.         break;
  322.       }         
  323.       myRecAttrArr[j-1] = myOp->getValue("Y", NULL);
  324.     }
  325.     before = NdbTick_CurrentMillisecond();
  326.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  327.       {
  328.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  329.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  330.         myNdb.closeTransaction(myTrans);
  331.         break;
  332.       }
  333.     after = NdbTick_CurrentMillisecond();
  334.     if (noOfOperations == 1)
  335.       printf("Read 1 tuple, %u msecn", (Uint32) after - before);
  336.     else
  337.       printf("Read %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  338.     for(unsigned int j = 0; j<noOfOperations; j++)
  339.       printf("Y = %un", myRecAttrArr[j]->u_32_value());
  340.     if (!oneTrans) myNdb.closeTransaction(myTrans);
  341.   }
  342.   if (oneTrans) {
  343.     if (myTrans->execute( Commit ) == -1) {
  344.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  345.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  346.     }
  347.     myNdb.closeTransaction(myTrans);
  348.   }
  349.   tafter = NdbTick_CurrentMillisecond();
  350.   ndbout << "Read "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  351. }
  352. static void readIndex(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool includePrimary, bool oneTrans, bool longKey)
  353. {
  354.   Uint64 tbefore, tafter, before, after;
  355.   NdbConnection  *myTrans;  
  356.   NdbIndexOperation   *myOp; 
  357.   char indexName[] = "INDEX0000";
  358.   NdbRecAttr* myRecAttrArr[MAX_NO_PARALLEL_OPERATIONS];
  359.   
  360.   tbefore = NdbTick_CurrentMillisecond();
  361.   if (oneTrans) myTrans = myNdb.startTransaction();
  362.   for (unsigned int i = 0; i<noOfTuples; i++) {
  363.     if (!oneTrans) myTrans = myNdb.startTransaction();
  364.     for(unsigned int j = 1; 
  365. ((j<=noOfOperations)&&(i<noOfTuples)); 
  366. (++j<=noOfOperations)?i++:i) { 
  367.       if (myTrans == NULL) 
  368.         error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  369.                        myNdb.getNdbError().code, myNdb.getNdbError().message);
  370.       
  371.       myOp = myTrans->getNdbIndexOperation(indexName, "THE_TABLE"); 
  372.       if (myOp == NULL) 
  373.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  374.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  375.       
  376.       myOp->readTuple();
  377.       if (includePrimary) {
  378.         if (myOp->equal("X", i) == -1) {
  379.           error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  380.                          myTrans->getNdbError().code, myTrans->getNdbError().message);
  381.           myNdb.closeTransaction(myTrans);
  382.           break;
  383.         }         
  384.       } 
  385.       if (myOp->equal("Y", i+1) == -1) {
  386.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  387.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  388.         myNdb.closeTransaction(myTrans);
  389.         break;
  390.       }          
  391.       myRecAttrArr[j-1] = myOp->getValue("Y", NULL);
  392.     }
  393.     before = NdbTick_CurrentMillisecond();
  394.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  395.       {
  396.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  397.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  398.         myNdb.closeTransaction(myTrans);
  399.         break;
  400.       }
  401.     after = NdbTick_CurrentMillisecond();
  402.     if (noOfOperations == 1)
  403.       printf("Read 1 tuple, %u msecn", (Uint32) after - before);
  404.     else
  405.       printf("Read %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  406.     for(unsigned int j = 0; j<noOfOperations; j++)
  407.       printf("Y = %un", myRecAttrArr[j]->u_32_value());
  408.     if (!oneTrans) myNdb.closeTransaction(myTrans);
  409.   }
  410.   if (oneTrans) {
  411.     if (myTrans->execute( Commit ) == -1) {
  412.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  413.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  414.     }
  415.     myNdb.closeTransaction(myTrans);
  416.   }
  417.   tafter = NdbTick_CurrentMillisecond();
  418.   ndbout << "Read "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  419. }
  420. static void updateIndex(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool includePrimary, bool oneTrans, bool longKey)
  421. {
  422.   Uint64 tbefore, tafter, before, after;
  423.   NdbConnection  *myTrans;  
  424.   NdbIndexOperation   *myOp;   
  425.   char indexName[] = "INDEX0000";
  426.   
  427.   tbefore = NdbTick_CurrentMillisecond();
  428.   if (oneTrans) myTrans = myNdb.startTransaction();
  429.   for (unsigned int i = 0; i<noOfTuples; i++) {
  430.     if (!oneTrans) myTrans = myNdb.startTransaction();
  431.     for(unsigned int j = 1; 
  432. ((j<=noOfOperations)&&(i<noOfTuples)); 
  433. (++j<=noOfOperations)?i++:i) { 
  434.       if (myTrans == NULL) 
  435.         error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  436.                        myNdb.getNdbError().code, myNdb.getNdbError().message);
  437.       
  438.       myOp = myTrans->getNdbIndexOperation(indexName, "THE_TABLE"); 
  439.       if (myOp == NULL) 
  440.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  441.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  442.       
  443.       myOp->updateTuple();
  444.       if (includePrimary) {
  445.         if (myOp->equal("X", i) == -1) {
  446.           error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  447.                          myTrans->getNdbError().code, myTrans->getNdbError().message);
  448.           myNdb.closeTransaction(myTrans);
  449.           break;
  450.         }         
  451.       } 
  452.       if (myOp->equal("Y", i+1) == -1) {
  453.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  454.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  455.         myNdb.closeTransaction(myTrans);
  456.         break;
  457.       } 
  458.       // Update index itself, should be possible
  459.       if (myOp->setValue("Y", i+2) == -1) {
  460.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  461.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  462.         myNdb.closeTransaction(myTrans);
  463.         break;
  464.       }      
  465.     }
  466.     before = NdbTick_CurrentMillisecond();
  467.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  468.       {
  469.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  470.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  471.         myNdb.closeTransaction(myTrans);
  472.         break;
  473.       }
  474.     after = NdbTick_CurrentMillisecond();
  475.     if (noOfOperations == 1)
  476.       printf("Updated 1 tuple, %u msecn", (Uint32) after - before);
  477.     else
  478.       printf("Updated %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  479.     if (!oneTrans) myNdb.closeTransaction(myTrans);
  480.   }
  481.   if (oneTrans) {
  482.     if (myTrans->execute( Commit ) == -1) {
  483.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  484.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  485.     }
  486.     myNdb.closeTransaction(myTrans);
  487.   }
  488.   tafter = NdbTick_CurrentMillisecond();
  489.   
  490.   ndbout << "Updated "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  491. }
  492. static void deleteIndex(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool includePrimary, bool oneTrans, bool longKey)
  493. {
  494.   Uint64 tbefore, tafter, before, after;
  495.   NdbConnection  *myTrans;  
  496.   NdbIndexOperation   *myOp;   
  497.   char indexName[] = "INDEX0000";
  498.   
  499.   tbefore = NdbTick_CurrentMillisecond();
  500.   if (oneTrans) myTrans = myNdb.startTransaction();
  501.   for (unsigned int i = 0; i<noOfTuples; i++) {
  502.     for(unsigned int j = 1; 
  503. ((j<=noOfOperations)&&(i<noOfTuples)); 
  504. (++j<=noOfOperations)?i++:i) { 
  505.       if (!oneTrans) myTrans = myNdb.startTransaction();
  506.       if (myTrans == NULL) 
  507.         error_handler4(__LINE__, myNdb.getNdbError().status, myNdb.getNdbError().classification,
  508.                        myNdb.getNdbError().code, myNdb.getNdbError().message);
  509.       
  510.       myOp = myTrans->getNdbIndexOperation(indexName, "THE_TABLE"); 
  511.       if (myOp == NULL) 
  512.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  513.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  514.       
  515.       myOp->deleteTuple();
  516.       if (includePrimary) {
  517.         if (myOp->equal("X", i) == -1) {
  518.           error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  519.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  520.           myNdb.closeTransaction(myTrans);
  521.           break;
  522.         }         
  523.       } 
  524.       if (myOp->equal("Y", i+1) == -1) {
  525.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  526.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  527.       myNdb.closeTransaction(myTrans);
  528.       break;
  529.       }          
  530.     }
  531.     before = NdbTick_CurrentMillisecond();
  532.     if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)
  533.       {
  534.         error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  535.                        myTrans->getNdbError().code, myTrans->getNdbError().message);
  536.         myNdb.closeTransaction(myTrans);
  537.         break;
  538.       }
  539.     after = NdbTick_CurrentMillisecond();
  540.     if (noOfOperations == 1)
  541.       printf("Deleted 1 tuple, %u msecn", (Uint32) after - before);
  542.     else
  543.       printf("Deleted %u tuples, %u msecn", noOfOperations, (Uint32) after - before);
  544.     if (!oneTrans) myNdb.closeTransaction(myTrans);
  545.   }
  546.   if (oneTrans) {
  547.     if (myTrans->execute( Commit ) == -1) {
  548.       error_handler4(__LINE__, myTrans->getNdbError().status, myTrans->getNdbError().classification, 
  549.                      myTrans->getNdbError().code, myTrans->getNdbError().message);
  550.     }
  551.     myNdb.closeTransaction(myTrans);
  552.   }
  553.   tafter = NdbTick_CurrentMillisecond();
  554.   ndbout << "Deleted "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        
  555. }
  556. static void dropIndex(Ndb &myNdb, unsigned int noOfIndexes)
  557. {
  558.   for(unsigned int indexNum = 0; indexNum < noOfIndexes; indexNum++) {
  559.     char indexName[255];
  560.     sprintf(indexName, "INDEX%.4u", indexNum);
  561.     const Uint64 before = NdbTick_CurrentMillisecond();
  562.     const int retVal = myNdb.getDictionary()->dropIndex(indexName,"THE_TABLE");
  563.     const Uint64 after = NdbTick_CurrentMillisecond();
  564.     
  565.     if(retVal == 0){
  566.       ndbout << "Dropped index " << indexName << ", " 
  567.      << after - before << " msec" << endl;
  568.     } else {
  569.       ndbout << "Failed to drop index " << indexName << endl;
  570.       ndbout << myNdb.getDictionary()->getNdbError() << endl;
  571.     }
  572.   }
  573. }
  574. NDB_COMMAND(indexTest, "indexTest", "indexTest", "indexTest", 65535)
  575. {
  576.   ndb_init();
  577.   bool createTableOp, createIndexOp, dropIndexOp, insertOp, updateOp, deleteOp, readOp, readIndexOp, updateIndexOp, deleteIndexOp, twoKey, longKey;
  578.   unsigned int noOfTuples = 1;
  579.   unsigned int noOfOperations = 1;
  580.   unsigned int noOfIndexes = 1;
  581.   int i = 1;
  582.   Ndb myNdb( "TEST_DB" );
  583.   int check;
  584.   bool storeInACC = false;
  585.   bool includePrimary = false;
  586.   bool oneTransaction = false;
  587.   createTableOp = createIndexOp = dropIndexOp = insertOp = updateOp = deleteOp = readOp = readIndexOp = updateIndexOp = deleteIndexOp = twoKey = longKey = false;
  588.   // Read arguments
  589.   if (argc > 1)
  590.     while (argc > 1)
  591.       {
  592. if (strcmp(argv[i], "-T") == 0)
  593.   {
  594.     createTableOp = true;
  595.     argc -= 1;
  596.     i++;
  597.   }
  598. else if (strcmp(argv[i], "-c") == 0)
  599.   {
  600.     createIndexOp = true;
  601.     argc -= 1;
  602.     i++;
  603.   }
  604. else if (strcmp(argv[i], "-X") == 0)
  605.   {
  606.     dropIndexOp = true;
  607.     argc -= 1;
  608.     i++;
  609.   }
  610. else if (strcmp(argv[i], "-I") == 0)
  611.   {
  612.     insertOp = true;
  613.     argc -= 1;
  614.     i++;
  615.   }
  616. else if (strcmp(argv[i], "-D") == 0)
  617.   {
  618.     deleteOp = true;
  619.     argc -= 1;
  620.     i++;
  621.   }
  622. else if (strcmp(argv[i], "-U") == 0)
  623.   {
  624.     updateOp = true;
  625.     argc -= 1;
  626.     i++;
  627.   }
  628. else if (strcmp(argv[i], "-R") == 0)
  629.   {
  630.     readOp = true;
  631.     argc -= 1;
  632.     i++;
  633.   }
  634. else if (strcmp(argv[i], "-r") == 0)
  635.   {
  636.     readIndexOp = true;
  637.     argc -= 1;
  638.     i++;
  639.   }
  640. else if (strcmp(argv[i], "-u") == 0)
  641.   {
  642.     updateIndexOp = true;
  643.     argc -= 1;
  644.     i++;
  645.   }
  646. else if (strcmp(argv[i], "-d") == 0)
  647.   {
  648.     deleteIndexOp = true;
  649.     argc -= 1;
  650.     i++;
  651.   }
  652. else if (strcmp(argv[i], "-s") == 0)
  653.   {
  654.     storeInACC = true;
  655.     argc -= 1;
  656.     i++;
  657.   }
  658. else if (strcmp(argv[i], "-p") == 0)
  659.   {
  660.     includePrimary = true;
  661.     argc -= 1;
  662.     i++;
  663.   }
  664. else if (strcmp(argv[i], "-L") == 0)
  665.   {
  666.     longKey = true;
  667.     argc -= 1;
  668.     i++;
  669.   }
  670.   else if (strcmp(argv[i], "-1") == 0)
  671.   {
  672.     oneTransaction = true;
  673.     argc -= 1;
  674.     i++;
  675.   }       
  676.   else if (strcmp(argv[i], "-2") == 0)
  677.   {
  678.     twoKey = true;
  679.     argc -= 1;
  680.     i++;
  681.   }       
  682.         else if (strstr(argv[i], "-n") != 0)
  683.           {
  684.             noOfTuples = atoi(argv[i]+2);
  685.             argc -= 1;
  686.             i++;
  687.           }
  688.         else if (strstr(argv[i], "-o") != 0)
  689.           {
  690.             noOfOperations = MIN(MAX_NO_PARALLEL_OPERATIONS, atoi(argv[i]+2));
  691.             argc -= 1;
  692.             i++;
  693.           }
  694.         else if (strstr(argv[i], "-m") != 0)
  695.           {
  696.             noOfIndexes = atoi(argv[i]+2);
  697.             argc -= 1;
  698.             i++;
  699.           }
  700. else if (strstr(argv[i], "-h") != 0)
  701.           {
  702.     printf("Synopsis: 
  703. index
  704. -T create table
  705.          -L include a long attribute in key or index
  706.          -2 define primary key with two attributes
  707.          -c create index
  708. -p make index unique (include primary key attribute)
  709.          -r read using index
  710. -u update using index
  711. -d delete using index
  712. -n<no operations> do n operations (for -I -r -u -d -R -U -D)
  713. -o<no parallel operations> (for -I -r -u -d -R -U -D)
  714. -m<no indexes>n");
  715.             argc -= 1;
  716.             i++;
  717.   }
  718. else {
  719.   char errStr[256];
  720.   sprintf(errStr, "Illegal argument: %s", argv[i]);
  721.   error_handler(errStr);
  722.   exit(-1);
  723. }
  724.       }
  725.   else
  726.     {
  727.       createTableOp = createIndexOp = dropIndexOp = insertOp = updateOp = deleteOp = true;
  728.     }
  729.   if (longKey) {
  730.     longName = (char *)  malloc(1024);
  731.     for (int i = 0; i < 1023; i++)
  732.       longName[i] = 'x'; 
  733.     longName[1023] = '';
  734.   }
  735.   sixtysix = (char *)  malloc(256);
  736.   for (int i = 0; i < 255; i++)
  737.     sixtysix[i] = ' '; 
  738.   sixtysix[255] = '';
  739.   strncpy(sixtysix, "sixtysix", strlen("sixtysix"));
  740.   ninetynine = (char *)  malloc(256);
  741.   for (int i = 0; i < 255; i++)
  742.     ninetynine[i] = ' '; 
  743.   ninetynine[255] = '';
  744.   strncpy(ninetynine, "ninetynine", strlen("ninetynine"));
  745.   hundred = (char *)  malloc(256);
  746.   for (int i = 0; i < 255; i++)
  747.     hundred[i] = ' '; 
  748.   hundred[255] = '';
  749.   strncpy(hundred, "hundred", strlen("hundred"));
  750.   myNdb.init();
  751.   // Wait for Ndb to become ready
  752.   if (myNdb.waitUntilReady(30) == 0)
  753.   {
  754.     if (createTableOp)
  755.       createTable(myNdb, storeInACC, twoKey, longKey);
  756.     if (createIndexOp)
  757.       createIndex(myNdb, includePrimary, noOfIndexes);
  758.     if (insertOp)
  759.       insertTable(myNdb, noOfTuples, noOfOperations, oneTransaction, twoKey, longKey);
  760.     if (updateOp)
  761.       updateTable(myNdb, noOfTuples, noOfOperations, oneTransaction, twoKey, longKey);
  762.     if (deleteOp)
  763.       deleteTable(myNdb, noOfTuples, noOfOperations, oneTransaction, twoKey, longKey);
  764.     if (readOp)
  765.       readTable(myNdb, noOfTuples, noOfOperations, oneTransaction, twoKey, longKey);
  766.     if (readIndexOp)
  767.       readIndex(myNdb, noOfTuples, noOfOperations, includePrimary, oneTransaction, longKey);
  768.     if (updateIndexOp)
  769.       updateIndex(myNdb, noOfTuples, noOfOperations, includePrimary, oneTransaction, longKey);
  770.     if (deleteIndexOp)
  771.       deleteIndex(myNdb, noOfTuples, noOfOperations, includePrimary, oneTransaction, longKey);
  772.     if (dropIndexOp)
  773.       dropIndex(myNdb, noOfIndexes);
  774.   }
  775.   
  776.   if (testPassed)
  777.     {
  778.       // Test passed
  779.       ndbout << "OK - Test passed" << endl;
  780.     }
  781.   else
  782.     {
  783.       // Test failed
  784.       ndbout << "FAIL - Test failed" << endl;
  785.       exit(-1);
  786.     }
  787.   return NULL;
  788. }