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

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.        INITRONJA
  15.        Initialise benchmark for Ronja Database
  16.  * *************************************************** */
  17. #include "NdbApi.hpp"
  18. #include "NdbSchemaCon.hpp"
  19. #include <NdbOut.hpp>
  20. #include <NdbMain.h>
  21. #include <NdbTest.hpp>
  22. #include <string.h>
  23. #define MAXSTRLEN 16 
  24. #define MAXATTR 64
  25. #define MAXTABLES 64
  26. #define MAXTHREADS 256
  27. #define MAXATTRSIZE 8000
  28. static unsigned int tNoOfRecords;
  29. static unsigned int tNoOfLoops;
  30. static unsigned int tNoOfTables;
  31. static int tAttributeSize;
  32. static int tNodeId;
  33. static unsigned int tValue;
  34. static unsigned int tNoOfOperations;
  35. static char tableName[MAXTABLES][MAXSTRLEN];
  36. static char attrName[MAXATTR][MAXSTRLEN];
  37. inline int InsertRecords(Ndb*, int) ;
  38. NDB_COMMAND(initronja, "initronja", "initronja", "initronja", 65535){
  39.   ndb_init();
  40.   Ndb*  pNdb = NULL ;
  41.   NdbSchemaCon *MySchemaTransaction = NULL ;
  42.   NdbSchemaOp *MySchemaOp = NULL ;
  43.   
  44.   
  45.   int check, status, i, j, cont ;
  46.   check = status = i = j = cont = 0 ;
  47.   tNoOfRecords = 500 ;
  48.   tNoOfLoops = tNoOfRecords / 10;
  49.   i = 1;
  50.   while (argc > 1){
  51.     if (strcmp(argv[i], "-r") == 0){
  52.   if( NULL == argv[i+1] ) goto error_input ; 
  53.   tNoOfRecords = atoi(argv[i+1]);
  54.       tNoOfRecords = tNoOfRecords - (tNoOfRecords % 10);
  55.       tNoOfLoops = tNoOfRecords / 10;
  56.       if ((tNoOfRecords < 1) || (tNoOfRecords > 1000000000)) goto error_input;
  57.     }else{
  58.       goto error_input;
  59.     }
  60.     argc -= 2;
  61.     i = i + 2; //
  62.   }
  63.   pNdb = new Ndb( "TEST_DB" ) ;
  64.   ndbout << "Initialisation started. " << endl;
  65.   pNdb->init();
  66.   ndbout << "Initialisation completed. " << endl;
  67.   
  68.   tNodeId = pNdb->getNodeId();
  69.   ndbout << endl << "Initial loading of Ronja Database" << endl;
  70.   ndbout << "  NdbAPI node with id = " << tNodeId << endl;
  71.   
  72.   if (pNdb->waitUntilReady(30) != 0) {
  73.     ndbout << "Benchmark failed - NDB is not ready" << endl;
  74. delete pNdb ;
  75.     return NDBT_ProgramExit(NDBT_FAILED) ;
  76.   }//if
  77.   
  78.   ndbout << endl << "Creating the table SHORT_REC" << "..." << endl;
  79.   MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);
  80.   if(!MySchemaTransaction) goto error_handler;
  81.   MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  82.   if(!MySchemaOp) goto error_handler;
  83. #if defined NDB_OSE || defined NDB_SOFTOSE
  84.   check = MySchemaOp->createTable( "SHORT_REC"
  85.    ,8 // Table Size
  86.    ,TupleKey // Key Type
  87.    ,40 // Nr of Pages
  88.    ,All
  89.    ,6
  90.    ,78
  91.    ,80
  92.    ,1
  93.    ,false);   
  94. #else
  95.   check = MySchemaOp->createTable( "SHORT_REC"
  96.    ,8 // Table Size
  97.    ,TupleKey // Key Type
  98.    ,40 // Nr of Pages
  99.    );
  100. #endif
  101.   if (check == -1) goto error_handler;
  102.   ndbout << "Key attribute..." ;
  103.   check = MySchemaOp->createAttribute( (char*)"Key", TupleKey, 32, 1,
  104.      UnSigned, MMBased, NotNullAttribute );
  105.   if (check == -1) goto error_handler;
  106.   ndbout << "ttOK" << endl ;
  107.   ndbout << "Flip attribute..." ;
  108.   check = MySchemaOp->createAttribute("Flip", NoKey, 32, 1,
  109.        UnSigned, MMBased, NotNullAttribute );
  110.   if (check == -1) goto error_handler;
  111.    ndbout << "ttOK" << endl ;
  112.   
  113.   ndbout << "Count attribute..." ;
  114.   check = MySchemaOp->createAttribute("Count", NoKey, 32, 1,
  115.        UnSigned, MMBased, NotNullAttribute );
  116.   if (check == -1) goto error_handler;
  117.   ndbout << "ttOK" << endl ;
  118.   
  119.   ndbout << "Placeholder attribute..." ;
  120.   check = MySchemaOp->createAttribute("Placeholder", NoKey, 8, 90,
  121.        UnSigned, MMBased, NotNullAttribute );
  122.   if (check == -1) goto error_handler;
  123.   ndbout << "tOK" << endl ;
  124.   
  125.   if (MySchemaTransaction->execute() == -1) {
  126.   if(721 == MySchemaOp->getNdbError().code){
  127.   ndbout << "Table SHORT_REC already exists" << endl ;
  128.   }else{
  129.   ndbout << MySchemaTransaction->getNdbError() << endl;
  130.   }   
  131.   }else{
  132.   ndbout << "SHORT_REC created " << endl;
  133.   }// if
  134.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  135.   
  136.   ndbout << endl << "Creating the table LONG_REC..." << endl;
  137.   MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);
  138.   if(!MySchemaTransaction) goto error_handler;
  139.    
  140.   MySchemaOp = MySchemaTransaction->getNdbSchemaOp();
  141.   if(!MySchemaOp) goto error_handler;
  142. #if defined NDB_OSE || defined NDB_SOFTOSE
  143.   check = MySchemaOp->createTable( "LONG_REC"
  144.    ,8 // Table Size
  145.    ,TupleKey // Key Type
  146.    ,40 // Nr of Pages
  147.    ,All 
  148.    ,6
  149.    ,78
  150.    ,80
  151.    ,1
  152.    ,false);        
  153. #else
  154.   check = MySchemaOp->createTable( "LONG_REC"
  155.        ,8 // Table Size
  156.        ,TupleKey // Key Type
  157.        ,40 // Nr of Pages
  158.        );
  159. #endif
  160.   if (check == -1) goto error_handler;
  161.   ndbout << "Key attribute..." ;
  162.   check = MySchemaOp->createAttribute( (char*)"Key", TupleKey, 32, 1,
  163.      UnSigned, MMBased, NotNullAttribute );
  164.   if (check == -1) goto error_handler;
  165.   ndbout << "ttOK" << endl ;
  166.   ndbout << "Flip attribute..." ;
  167.   check = MySchemaOp->createAttribute("Flip", NoKey, 32, 1,
  168.        UnSigned, MMBased, NotNullAttribute );
  169.   if (check == -1) goto error_handler;
  170.    ndbout << "ttOK" << endl ;
  171.   
  172.   ndbout << "Count attribute..." ;
  173.   check = MySchemaOp->createAttribute("Count", NoKey, 32, 1,
  174.        UnSigned, MMBased, NotNullAttribute );
  175.   if (check == -1) goto error_handler;
  176.    ndbout << "ttOK" << endl ;
  177.   
  178.   ndbout << "Placeholder attribute..." ;
  179.   check = MySchemaOp->createAttribute("Placeholder", NoKey, 8, 1014,
  180.        UnSigned, MMBased, NotNullAttribute );
  181.   if (check == -1) goto error_handler;
  182.   ndbout << "tOK" << endl ;
  183.   
  184.   if (MySchemaTransaction->execute() == -1) {
  185.   if(721 == MySchemaOp->getNdbError().code){
  186.   ndbout << "Table LONG_REC already exists" << endl ;
  187.   }else{
  188.   ndbout << MySchemaTransaction->getNdbError() << endl;
  189.   }   
  190.   }else{
  191.   ndbout << "LONG_REC created" << endl;
  192.   }// if
  193.   
  194.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  195.   
  196.   check = InsertRecords(pNdb, tNoOfRecords);
  197.   
  198.   delete pNdb ;
  199.   if(-1 == check){
  200.   ndbout << endl << "Initial loading of Ronja Database failed" << endl;
  201.   return NDBT_ProgramExit(NDBT_FAILED) ; 
  202.   }else{
  203.       ndbout << endl << "Initial loading of Ronja Database completed" << endl;
  204.   return NDBT_ProgramExit(NDBT_OK) ; 
  205.   }
  206.  
  207.   
  208.   
  209.  
  210. error_handler:
  211.   ndbout << "SchemaTransaction returned error:" ;
  212.   ndbout << MySchemaTransaction->getNdbError() << endl;
  213.   NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);
  214.   delete pNdb ;
  215.   NDBT_ProgramExit(NDBT_FAILED) ;
  216.   exit(-1);
  217. error_input:
  218.   ndbout << endl << "  Ivalid parameter(s)" << endl;
  219.   ndbout <<         "  Usage: initronja [-r n] , where 'n' is the number of records to be inserted" << endl;
  220.   ndbout << "  If omitted, 500 records will be created by default" << endl;
  221.   ndbout << "  Note: use this number in combination with '-r' argument when running 'benchronja'" << endl << endl;
  222.   NDBT_ProgramExit(NDBT_WRONGARGS) ;
  223.   exit(1);
  224. }
  225. ////////////////////////////////////////
  226. inline int InsertRecords(Ndb* pNdb, int nNoRecords){
  227.    
  228.     NdbConnection *MyTransaction = NULL ;
  229.     NdbOperation* MyOperation[10];
  230.  
  231.     int Tsuccess = 0 ;
  232. int loop_count_ops = 2 * tNoOfLoops;
  233.     int loop_count_tables = 10;
  234.     int loop_count_attributes = 0 ;
  235.     int check = 0;
  236.     int count = 0 ;
  237.     int count_tables = 0;
  238.     int count_attributes = 0 ;
  239.     int i = 0 ;
  240.     int  tType = 0 ;
  241.     unsigned int attrValue[1000];
  242. unsigned int setAttrValue = 0;
  243. unsigned int keyValue[3];
  244. for (i = 0; i < 1000; i ++) attrValue[i] = 1;
  245. for (count=0 ; count < loop_count_ops ; count++){
  246.   if ((((count / 100)* 100) == count) && (count != 0)){
  247.   ndbout << "1000 records inserted again, " << (count/100) << "000 records now inserted" << endl;
  248.   }
  249.   
  250.   MyTransaction = pNdb->startTransaction();
  251.   if(!MyTransaction){
  252.   ndbout << "startTransaction: " << pNdb->getNdbError();
  253.   ndbout << " count = " << count << endl;
  254.   return -1 ;
  255.   }
  256.      
  257.   for (count_tables = 0; count_tables < loop_count_tables; count_tables++) {
  258.   if (count < tNoOfLoops) {
  259.   keyValue[0] = count*10 + count_tables ;
  260.   MyOperation[count_tables] = MyTransaction->getNdbOperation("SHORT_REC") ;
  261.   }else{
  262.   keyValue[0] = (count - tNoOfLoops)*10 + count_tables;
  263.   MyOperation[count_tables] = MyTransaction->getNdbOperation("LONG_REC");
  264.   }//if
  265.   
  266.   if (!MyOperation[count_tables]) goto error_handler1;
  267.   
  268.   check = MyOperation[count_tables]->insertTuple();
  269.   if (check == -1) goto error_handler2;
  270.           
  271.       check = MyOperation[count_tables]->equal("Key",(char*)&keyValue[0]);
  272.               if (check == -1) goto error_handler4;
  273.               check = MyOperation[count_tables]->setValue("Flip",(char*)&setAttrValue);
  274.               if (check == -1) goto error_handler5;
  275.           
  276.       check = MyOperation[count_tables]->setValue("Count",(char*)&setAttrValue);
  277.               if (check == -1) goto error_handler5;
  278.           
  279.       check = MyOperation[count_tables]->setValue("Placeholder",(char*)&attrValue[0]);
  280.               if (check == -1) goto error_handler5;
  281.   }//for
  282.      
  283.   if (MyTransaction->execute( Commit ) == -1){
  284.   ndbout << MyTransaction->getNdbError()<< endl ;
  285.   ndbout << "count = " << count << endl;
  286.   }//if
  287.   
  288.   pNdb->closeTransaction(MyTransaction) ;
  289.   }//for
  290.   return 0;
  291. error_handler1:
  292.    ndbout << "Error occured in getNdbOperation " << endl;
  293.    ndbout << MyTransaction->getNdbError() << endl;
  294.    pNdb->closeTransaction(MyTransaction);
  295.    return -1 ;
  296. error_handler2:
  297.    ndbout << "Error occured in defining operation " << endl;
  298.    ndbout << MyOperation[count_tables]->getNdbError() << endl;
  299.    pNdb->closeTransaction(MyTransaction);
  300.    return -1 ;
  301. error_handler3:
  302.    pNdb->closeTransaction(MyTransaction);
  303.    return -1 ;
  304.   
  305. error_handler4:
  306.    ndbout << "Error occured in equal " << endl;
  307.    ndbout << MyOperation[count_tables]->getNdbError() << endl;
  308.    pNdb->closeTransaction(MyTransaction);
  309.    return -1 ;
  310.   
  311. error_handler5:
  312.    ndbout << "Error occured in get/setValue " << endl;
  313.    ndbout << MyOperation[count_tables]->getNdbError() << endl;
  314.    pNdb->closeTransaction(MyTransaction);
  315.    return -1 ;
  316. }