initronja.cpp

来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 352 行

CPP
352
字号
/* Copyright (C) 2003 MySQL AB   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA *//* ***************************************************       INITRONJA       Initialise benchmark for Ronja Database * *************************************************** */#include "NdbApi.hpp"#include "NdbSchemaCon.hpp"#include <NdbOut.hpp>#include <NdbMain.h>#include <NdbTest.hpp>#include <string.h>#define MAXSTRLEN 16 #define MAXATTR 64#define MAXTABLES 64#define MAXTHREADS 256#define MAXATTRSIZE 8000static unsigned int tNoOfRecords;static unsigned int tNoOfLoops;static unsigned int tNoOfTables;static int tAttributeSize;static int tNodeId;static unsigned int tValue;static unsigned int tNoOfOperations;static char tableName[MAXTABLES][MAXSTRLEN];static char attrName[MAXATTR][MAXSTRLEN];inline int InsertRecords(Ndb*, int) ;NDB_COMMAND(initronja, "initronja", "initronja", "initronja", 65535){  ndb_init();  Ndb*			 pNdb = NULL ;  NdbSchemaCon	*MySchemaTransaction = NULL ;  NdbSchemaOp	*MySchemaOp = NULL ;      int check, status, i, j, cont ;  check = status = i = j = cont = 0 ;  tNoOfRecords = 500 ;  tNoOfLoops = tNoOfRecords / 10;  i = 1;  while (argc > 1){    if (strcmp(argv[i], "-r") == 0){	  if( NULL == argv[i+1] ) goto error_input ; 	  tNoOfRecords = atoi(argv[i+1]);      tNoOfRecords = tNoOfRecords - (tNoOfRecords % 10);      tNoOfLoops = tNoOfRecords / 10;      if ((tNoOfRecords < 1) || (tNoOfRecords > 1000000000)) goto error_input;    }else{      goto error_input;    }    argc -= 2;    i = i + 2; //  }  pNdb = new Ndb( "TEST_DB" ) ;	  ndbout << "Initialisation started. " << endl;  pNdb->init();  ndbout << "Initialisation completed. " << endl;    tNodeId = pNdb->getNodeId();  ndbout << endl << "Initial loading of Ronja Database" << endl;  ndbout << "  NdbAPI node with id = " << tNodeId << endl;    if (pNdb->waitUntilReady(30) != 0) {    ndbout << "Benchmark failed - NDB is not ready" << endl;	delete pNdb ;    return NDBT_ProgramExit(NDBT_FAILED) ;  }//if    ndbout << endl << "Creating the table SHORT_REC" << "..." << endl;  MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);  if(!MySchemaTransaction) goto error_handler;  MySchemaOp = MySchemaTransaction->getNdbSchemaOp();	  if(!MySchemaOp) goto error_handler;#if defined NDB_OSE || defined NDB_SOFTOSE  check = MySchemaOp->createTable( "SHORT_REC"				   ,8		// Table Size				   ,TupleKey	// Key Type				   ,40		// Nr of Pages				   ,All				   ,6				   ,78				   ,80				   ,1				   ,false);				  #else  check = MySchemaOp->createTable( "SHORT_REC"				   ,8		// Table Size				   ,TupleKey	// Key Type				   ,40		// Nr of Pages				   );#endif  if (check == -1) goto error_handler;  ndbout << "Key attribute..." ;  check = MySchemaOp->createAttribute( (char*)"Key", TupleKey, 32, 1,					     UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;  ndbout << "\t\tOK" << endl ;  ndbout << "Flip attribute..." ;  check = MySchemaOp->createAttribute("Flip", NoKey, 32, 1,						       UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;   ndbout << "\t\tOK" << endl ;    ndbout << "Count attribute..." ;  check = MySchemaOp->createAttribute("Count", NoKey, 32, 1,						       UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;  ndbout << "\t\tOK" << endl ;    ndbout << "Placeholder attribute..." ;  check = MySchemaOp->createAttribute("Placeholder", NoKey, 8, 90,						       UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;  ndbout << "\tOK" << endl ;    if (MySchemaTransaction->execute() == -1) {	  if(721 == MySchemaOp->getNdbError().code){		  ndbout << "Table SHORT_REC already exists" << endl ;	  }else{		  ndbout << MySchemaTransaction->getNdbError() << endl;	  }     }else{	  ndbout << "SHORT_REC created " << endl;  }// if  NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);    ndbout << endl << "Creating the table LONG_REC..." << endl;  MySchemaTransaction = NdbSchemaCon::startSchemaTrans(pNdb);  if(!MySchemaTransaction) goto error_handler;     MySchemaOp = MySchemaTransaction->getNdbSchemaOp();	  if(!MySchemaOp) goto error_handler;#if defined NDB_OSE || defined NDB_SOFTOSE  check = MySchemaOp->createTable( "LONG_REC"				   ,8		// Table Size				   ,TupleKey	// Key Type				   ,40		// Nr of Pages				   ,All 				   ,6				   ,78				   ,80				   ,1				   ,false);				       #else  check = MySchemaOp->createTable( "LONG_REC"				       ,8		// Table Size				       ,TupleKey	// Key Type				       ,40		// Nr of Pages				       );#endif  if (check == -1) goto error_handler;  ndbout << "Key attribute..." ;  check = MySchemaOp->createAttribute( (char*)"Key", TupleKey, 32, 1,					     UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;  ndbout << "\t\tOK" << endl ;  ndbout << "Flip attribute..." ;  check = MySchemaOp->createAttribute("Flip", NoKey, 32, 1,						       UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;   ndbout << "\t\tOK" << endl ;    ndbout << "Count attribute..." ;  check = MySchemaOp->createAttribute("Count", NoKey, 32, 1,						       UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;   ndbout << "\t\tOK" << endl ;    ndbout << "Placeholder attribute..." ;  check = MySchemaOp->createAttribute("Placeholder", NoKey, 8, 1014,						       UnSigned, MMBased, NotNullAttribute );  if (check == -1) goto error_handler;  ndbout << "\tOK" << endl ;    if (MySchemaTransaction->execute() == -1) {	  if(721 == MySchemaOp->getNdbError().code){		  ndbout << "Table LONG_REC already exists" << endl ;	  }else{		  ndbout << MySchemaTransaction->getNdbError() << endl;	  }     }else{	  ndbout << "LONG_REC created" << endl;  }// if    NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);    check = InsertRecords(pNdb, tNoOfRecords);    delete pNdb ;  if(-1 == check){	  ndbout << endl << "Initial loading of Ronja Database failed" << endl;	  return NDBT_ProgramExit(NDBT_FAILED) ;   }else{      ndbout << endl << "Initial loading of Ronja Database completed" << endl;	  return NDBT_ProgramExit(NDBT_OK) ;   }      error_handler:  ndbout << "SchemaTransaction returned error:" ;  ndbout << MySchemaTransaction->getNdbError() << endl;  NdbSchemaCon::closeSchemaTrans(MySchemaTransaction);  delete pNdb ;  NDBT_ProgramExit(NDBT_FAILED) ;  exit(-1);error_input:  ndbout << endl << "  Ivalid parameter(s)" << endl;  ndbout <<         "  Usage: initronja [-r n] , where 'n' is the number of records to be inserted" << endl;  ndbout <<			"  If omitted, 500 records will be created by default" << endl;  ndbout <<			"  Note: use this number in combination with '-r' argument when running 'benchronja'" << endl << endl;  NDBT_ProgramExit(NDBT_WRONGARGS) ;  exit(1);}////////////////////////////////////////inline int InsertRecords(Ndb* pNdb, int nNoRecords){	       NdbConnection		*MyTransaction = NULL ;    NdbOperation*		MyOperation[10];     int				Tsuccess = 0 ;	int				loop_count_ops = 2 * tNoOfLoops;    int				loop_count_tables = 10;    int				loop_count_attributes = 0 ;    int				check = 0;    int				count = 0 ;    int				count_tables = 0;    int				count_attributes = 0 ;    int				i = 0 ;    int 			tType = 0 ;    unsigned int	attrValue[1000];	unsigned int	setAttrValue = 0;	unsigned int	keyValue[3];	for (i = 0; i < 1000; i ++) attrValue[i] = 1;		for (count=0 ; count < loop_count_ops ; count++){		  if ((((count / 100)* 100) == count) && (count != 0)){			  ndbout << "1000 records inserted again, " << (count/100) << "000 records now inserted" << endl;		  }		  		  MyTransaction = pNdb->startTransaction();		  if(!MyTransaction){			  ndbout << "startTransaction: " << pNdb->getNdbError();			  ndbout << " count = " << count << endl;			  return -1 ;		  }			  			  		  for (count_tables = 0; count_tables < loop_count_tables; count_tables++) {			  if (count < tNoOfLoops) {				  keyValue[0] = count*10 + count_tables ;				  MyOperation[count_tables] = MyTransaction->getNdbOperation("SHORT_REC") ;			  }else{				  keyValue[0] = (count - tNoOfLoops)*10 + count_tables;				  MyOperation[count_tables] = MyTransaction->getNdbOperation("LONG_REC");			  }//if				  			  if (!MyOperation[count_tables]) goto error_handler1;			  			  check = MyOperation[count_tables]->insertTuple();			  if (check == -1) goto error_handler2;          		      check = MyOperation[count_tables]->equal("Key",(char*)&keyValue[0]);              if (check == -1) goto error_handler4;              check = MyOperation[count_tables]->setValue("Flip",(char*)&setAttrValue);              if (check == -1) goto error_handler5;          		      check = MyOperation[count_tables]->setValue("Count",(char*)&setAttrValue);              if (check == -1) goto error_handler5;          		      check = MyOperation[count_tables]->setValue("Placeholder",(char*)&attrValue[0]);              if (check == -1) goto error_handler5;		  }//for     		  if (MyTransaction->execute( Commit ) == -1){			  ndbout << MyTransaction->getNdbError()<< endl ;			  ndbout << "count = " << count << endl;		  }//if		  		  pNdb->closeTransaction(MyTransaction) ;	  }//for	  return 0;error_handler1:   ndbout << "Error occured in getNdbOperation " << endl;   ndbout << MyTransaction->getNdbError() << endl;   pNdb->closeTransaction(MyTransaction);   return -1 ;error_handler2:   ndbout << "Error occured in defining operation " << endl;   ndbout << MyOperation[count_tables]->getNdbError() << endl;   pNdb->closeTransaction(MyTransaction);   return -1 ;error_handler3:   pNdb->closeTransaction(MyTransaction);   return -1 ;  error_handler4:   ndbout << "Error occured in equal " << endl;   ndbout << MyOperation[count_tables]->getNdbError() << endl;   pNdb->closeTransaction(MyTransaction);   return -1 ;  error_handler5:   ndbout << "Error occured in get/setValue " << endl;   ndbout << MyOperation[count_tables]->getNdbError() << endl;   pNdb->closeTransaction(MyTransaction);   return -1 ;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?