index.cpp

来自「MySQL数据库开发源码 值得一看哦」· C++ 代码 · 共 999 行 · 第 1/3 页

CPP
999
字号
/* 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 *//* ***************************************************       INDEX TEST 1       Test index functionality of NDB       Arguments:        -T create table        -L include a long attribute in key or index        -2 define primary key with two attributes        -c create index	-p make index unique (include primary key attribute)        -r read using index	-u update using index	-d delete using index	-n<no operations> do n operations (for -I -r -u -d -R -U -D)	-o<no parallel operations> (for -I -r -u -d -R -U -D)	-m<no indexes>       Returns:        0 - Test passed       -1 - Test failed        1 - Invalid arguments * *************************************************** */#include <ndb_global.h>#include <NdbApi.hpp>#include <NdbOut.hpp>#include <NdbTick.h>#include <NdbMain.h>#include <NdbTest.hpp>#include <NDBT_Error.hpp>#ifndef MIN#define MIN(x,y) (((x)<(y))?(x):(y))#endif#define MAX_NO_PARALLEL_OPERATIONS 100bool testPassed = true;static voiderror_handler(const NdbError & err){  // Test failed   ndbout << endl << err << endl;  testPassed = false;}static voiderror_handler4(int line, const NdbError & err){  ndbout << endl << "Line " << line << endl;  // Test failed   ndbout << err << endl;  testPassed = false;}static char *longName, *sixtysix, *ninetynine, *hundred;static void createTable(Ndb &myNdb, bool storeInACC, bool twoKey, bool longKey){  NdbDictionary::Dictionary* dict = myNdb.getDictionary();  NdbDictionary::Table table("PERSON");  //NdbDictionary::Column column(); // Bug  NdbDictionary::Column column;  int res;  column.setName("NAME");  column.setType(NdbDictionary::Column::Char);  column.setLength((longKey)?		   1024       // 1KB => long key		   :12);  column.setPrimaryKey(true);  column.setNullable(false);  table.addColumn(column);  if (twoKey) {    column.setName("KEY2");    column.setType(NdbDictionary::Column::Unsigned);    column.setLength(1);    column.setPrimaryKey(true);    column.setNullable(false);    table.addColumn(column);  }  column.setName("PNUM1");  column.setType(NdbDictionary::Column::Unsigned);  column.setLength(1);  column.setPrimaryKey(false);  column.setNullable(false);  table.addColumn(column);  column.setName("PNUM2");  column.setType(NdbDictionary::Column::Unsigned);  column.setLength(1);  column.setPrimaryKey(false);  column.setNullable(false);  table.addColumn(column);  column.setName("PNUM3");  column.setType(NdbDictionary::Column::Unsigned);  column.setLength(1);  column.setPrimaryKey(false);  column.setNullable(false);  table.addColumn(column);  column.setName("PNUM4");  column.setType(NdbDictionary::Column::Unsigned);  column.setLength(1);  column.setPrimaryKey(false);  column.setNullable(false);  table.addColumn(column);  column.setName("AGE");  column.setType(NdbDictionary::Column::Unsigned);  column.setLength(1);  column.setPrimaryKey(false);  column.setNullable(false);  table.addColumn(column);  column.setName("STRING_AGE");  column.setType(NdbDictionary::Column::Char);  column.setLength(1);  column.setLength(256);  column.setPrimaryKey(false);  column.setNullable(false);  table.addColumn(column);  if ((res = dict->createTable(table)) == -1) {    error_handler(dict->getNdbError());  }  else      ndbout << "Created table" << ((longKey)?" with long key":"") <<endl;}static void createIndex(Ndb &myNdb, bool includePrimary, unsigned int noOfIndexes){  Uint64 before, after;  NdbDictionary::Dictionary* dict = myNdb.getDictionary();  char indexName[] = "PNUMINDEX0000";  int res;  for(unsigned int indexNum = 0; indexNum < noOfIndexes; indexNum++) {    sprintf(indexName, "PNUMINDEX%.4u", indexNum);    NdbDictionary::Index index(indexName);    index.setTable("PERSON");    index.setType(NdbDictionary::Index::UniqueHashIndex);    if (includePrimary) {      const char* attr_arr[] = {"NAME", "PNUM1", "PNUM3"};      index.addIndexColumns(3, attr_arr);    }    else {      const char* attr_arr[] = {"PNUM1", "PNUM3"};      index.addIndexColumns(2, attr_arr);    }    before = NdbTick_CurrentMillisecond();    if ((res = dict->createIndex(index)) == -1) {      error_handler(dict->getNdbError());    }        after = NdbTick_CurrentMillisecond();    ndbout << "Created index " << indexName << ", " << after - before << " msec" << endl;  }}  static void insertTable(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool oneTrans, bool twoKey, bool longKey){  Uint64 tbefore, tafter, before, after;  NdbConnection  *myTrans;    NdbOperation   *myOp;     char name[] = "Kalle0000000";    tbefore = NdbTick_CurrentMillisecond();  if (oneTrans) myTrans = myNdb.startTransaction();  for (unsigned int i = 0; i<noOfTuples; i++) {    if (!oneTrans) myTrans = myNdb.startTransaction();    for(unsigned int j = 1; 	((j<=noOfOperations)&&(i<noOfTuples)); 	(++j<=noOfOperations)?i++:i) {       if (myTrans == NULL) 	error_handler4(__LINE__, myNdb.getNdbError());            myOp = myTrans->getNdbOperation("PERSON");       if (myOp == NULL) 	error_handler4(__LINE__, myTrans->getNdbError());            myOp->insertTuple();      sprintf(name, "Kalle%.7i", i);      if (longKey)	memcpy(longName, name, strlen(name));       if (myOp->equal("NAME", (longKey)?longName:name) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (twoKey)	if (myOp->equal("KEY2", i) == -1) {	  error_handler4(__LINE__, myTrans->getNdbError());	  myNdb.closeTransaction(myTrans);	  break;	}            if (myOp->setValue("PNUM1", 17) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("PNUM2", 18)) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("PNUM3", 19)) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("PNUM4", 20)) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("AGE", ((i % 2) == 0)?66:99) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("STRING_AGE", ((i % 2) == 0)?sixtysix:ninetynine) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }          }    if (noOfOperations == 1)      printf("Trying to insert person %s\n", name);    else      printf("Trying to insert %u persons\n", noOfOperations);    before = NdbTick_CurrentMillisecond();    if (myTrans->execute( (oneTrans) ? NoCommit : Commit ) == -1)      {        error_handler4(__LINE__, myTrans->getNdbError());        myNdb.closeTransaction(myTrans);        break;      }    after = NdbTick_CurrentMillisecond();    if (noOfOperations == 1)      printf("Inserted person %s, %u msec\n", name, (Uint32) after - before);    else      printf("Inserted %u persons, %u msec\n", noOfOperations, (Uint32) after - before);    if (!oneTrans) myNdb.closeTransaction(myTrans);  }  if (oneTrans) {    if (myTrans->execute( Commit ) == -1) {      error_handler4(__LINE__, myTrans->getNdbError());    }    myNdb.closeTransaction(myTrans);  }  tafter = NdbTick_CurrentMillisecond();  ndbout << "Inserted "<< noOfTuples << " tuples in " << ((oneTrans) ? 1 : noOfTuples) << " transaction(s), " << tafter - tbefore << " msec" << endl;        } static void updateTable(Ndb &myNdb, unsigned int noOfTuples, unsigned int noOfOperations, bool oneTrans, bool twoKey, bool longKey){  Uint64 tbefore, tafter, before, after;  NdbConnection  *myTrans;    NdbOperation   *myOp;     char name[] = "Kalle0000000";    tbefore = NdbTick_CurrentMillisecond();  if (oneTrans) myTrans = myNdb.startTransaction();  for (unsigned int i = 0; i<noOfTuples; i++) {    if (!oneTrans) myTrans = myNdb.startTransaction();    for(unsigned int j = 1; 	((j<=noOfOperations)&&(i<noOfTuples)); 	(++j<=noOfOperations)?i++:i) {       if (myTrans == NULL) 	error_handler4(__LINE__, myNdb.getNdbError());            myOp = myTrans->getNdbOperation("PERSON");       if (myOp == NULL) 	error_handler4(__LINE__, myTrans->getNdbError());            myOp->updateTuple();      sprintf(name, "Kalle%.7i", i);      if (longKey)	memcpy(longName, name, strlen(name));       if (myOp->equal("NAME", (longKey)?longName:name) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (twoKey)	if (myOp->equal("KEY2", i) == -1) {	  error_handler4(__LINE__, myTrans->getNdbError());	  myNdb.closeTransaction(myTrans);	  break;	}            if (myOp->setValue("PNUM1", 77) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("PNUM2", 88)) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("PNUM4", 99)) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("AGE", 100) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());	myNdb.closeTransaction(myTrans);	break;      }            if (myOp->setValue("STRING_AGE", hundred) == -1) {	error_handler4(__LINE__, myTrans->getNdbError());

⌨️ 快捷键说明

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