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 + -
显示快捷键?