📄 testdatabuffers.cpp
字号:
/* 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 *//* * testDataBuffers * * Test getValue() of byte arrays: * - using application buffers of different alignments and sizes * - using NdbApi allocated small (<32) and big (>=32) buffers * * Verifies fixes to tickets 189 and 206. * * Options: see printusage() below. * * Creates tables TB00 to TB15 */#include <ndb_global.h>#include <NdbMain.h>#include <NdbOut.hpp>#include <NdbApi.hpp>#include <NdbTest.hpp>#include <NdbSchemaCon.hpp>// limitsstatic int const MaxAttr = 64;static int const MaxOper = 1000;static int const MaxSize = 10000;static int const MaxOff = 64; // max offset to add to data bufferstatic int const MaxData = MaxSize + MaxOff + 100;// optionsstatic int attrcnt = 25;static int existok = 0;static bool kontinue = false;static int loopcnt = 1;static int opercnt = 100; // also does this many scansstatic int randomizer = 171317;static int sizelim = 500;static int xverbose = 0;static void printusage() { ndbout << "usage: testDataBuffers options [default/max]" << endl << "NOTE: too large combinations result in NDB error" << endl << "-a N number of attributes (including the key) [25/64]" << endl << "-e no error if table exists (assumed to have same structure)" << endl << "-k on error continue with next test case" << endl << "-l N number of loops to run, 0 means infinite [1]" << endl << "-o N number of operations (rows in each table) [100/1000]" << endl << "-r N source of randomness (big number (prime)) [171317]" << endl << "-s N array size limit (rounded up in some tests) [500/10000]" << endl << "-x extremely verbose" << endl << "Tables: TB00 .. TB15" << endl ;}static Ndb* ndb = 0;static NdbSchemaCon* tcon = 0;static NdbSchemaOp* top = 0;static NdbConnection* con = 0;static NdbOperation* op = 0;static NdbScanOperation* sop = 0;static NdbResultSet* rs = 0;static intndberror(char const* fmt, ...){ va_list ap; char buf[200]; va_start(ap, fmt); BaseString::vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); ndbout << buf << " --" << endl; if (ndb) ndbout << "ndb : " << ndb->getNdbError() << endl; if (tcon) ndbout << "tcon: " << tcon->getNdbError() << endl; if (top) ndbout << "top: " << top->getNdbError() << endl; if (con) ndbout << "con : " << con->getNdbError() << endl; if (op) ndbout << "op : " << op->getNdbError() << endl; return -1;}static intchkerror(char const* fmt, ...){ va_list ap; char buf[200]; va_start(ap, fmt); BaseString::vsnprintf(buf, sizeof(buf), fmt, ap); va_end(ap); ndbout << "*** check failed: " << buf << " ***" << endl; return -1;}// alignment of addresses and data sizesstatic bool isAligned(UintPtr x){ return ((x & 3) == 0);}static bool isAligned(char* p){ return isAligned(UintPtr(p));}static unsigned toAligned(UintPtr x){ while (! isAligned(x)) x++; return x;}static char* toAligned(char* p){ while (! isAligned(p)) p++; return p;}// byte value for key k column i byte jstatic int byteVal(int k, int i, int j){ return '0' + (k + i + j) % 10;}// tablesstatic char tab[20] = "";static struct col { char aAttrName[20]; AttrType aAttrType; int aAttrSize; int aArraySize; KeyType aTupleKey; bool nullable; NdbRecAttr* aRa; char* buf; int bufsiz; char data[MaxData];} ccol[MaxAttr];static int key = 0;// independent test bitsstatic bool alignAddr; // align our buffer addresses to 4xstatic bool alignSize; // align data sizes to 4xstatic bool useBuf; // use our buffers for outputstatic bool noRandom; // do not randomize sizes and offsetsstatic int testbits = 4;static intmakeSize(int i){ int n; if (noRandom) n = i; else n = i * randomizer; n %= sizelim; if (n <= 0) n = 1; if (alignSize) n = toAligned(n); return n;}static intmakeOff(int k){ int n; if (alignAddr) n = 0; else if (noRandom) n = k; else n = k * randomizer; n %= MaxOff; if (n < 0) n = -n; return n;}static inttestcase(Ndb_cluster_connection&cc, int flag){ ndbout << "--- case " << flag << " ---" << endl; sprintf(tab, "TB%02d", flag); alignAddr = ! (flag & 1); ndbout << (alignAddr ? "align addresses" : "mis-align addresses") << endl; alignSize = ! (flag & 2); ndbout << (alignSize ? "align data sizes" : "mis-align data sizes") << endl; useBuf = ! (flag & 4); ndbout << (useBuf ? "use our buffers" : "use ndbapi buffers") << endl; noRandom = ! (flag & 8); ndbout << (noRandom ? "simple sizes" : "randomize sizes") << endl; int smax = 0, stot = 0, i; if (xverbose) ndbout << "- define table " << tab << endl; for (i = 0; i < attrcnt; i++) { col& c = ccol[i]; memset(&c, 0, sizeof(c)); sprintf(c.aAttrName, "C%d", i); if (i == 0) { c.aAttrType = UnSigned; c.aAttrSize = 32; c.aArraySize = 1; c.aTupleKey = TupleKey; c.nullable = false; } else { c.aAttrType = String; c.aAttrSize = 8; c.aArraySize = makeSize(i); if (smax < c.aArraySize) smax = c.aArraySize; stot += c.aArraySize; c.aTupleKey = NoKey; c.nullable = true; if (xverbose) ndbout << "-- column " << i << " size=" << c.aArraySize << endl; } c.buf = toAligned(c.data); c.bufsiz = sizeof(c.data) - (c.buf - c.data); } ndbout << "tab=" << tab << " cols=" << attrcnt << " size max=" << smax << " tot=" << stot << endl; if ((tcon = NdbSchemaCon::startSchemaTrans(ndb)) == 0) return ndberror("startSchemaTransaction"); if ((top = tcon->getNdbSchemaOp()) == 0) return ndberror("getNdbSchemaOp"); if (top->createTable(tab) < 0) return ndberror("createTable"); for (i = 0; i < attrcnt; i++) { col& c = ccol[i]; if (top->createAttribute( c.aAttrName, c.aTupleKey, c.aAttrSize, c.aArraySize, c.aAttrType, MMBased, c.nullable ) < 0) return ndberror("createAttribute col=%d", i); } if (tcon->execute() < 0) { if (! (tcon->getNdbError().code == 721 && existok)) return ndberror("execute"); ndbout << "using " << tab << endl; } else { ndbout << "created " << tab << endl; } top = 0; tcon = 0; if (xverbose) ndbout << "- delete" << endl; int delcnt = 0; for (key = 0; key < opercnt; key++) { if ((con = ndb->startTransaction()) == 0) return ndberror("startTransaction key=%d", key); if ((op = con->getNdbOperation(tab)) == 0) return ndberror("getNdbOperation key=%d", key); if (op->deleteTuple() < 0) return ndberror("deleteTuple key=%d", key); for (i = 0; i < attrcnt; i++) { col& c = ccol[i]; if (i == 0) { if (op->equal(c.aAttrName, (char*)&key, sizeof(key)) < 0) return ndberror("equal key=%d", key); } else { } } if (con->execute(Commit) < 0) { if (con->getNdbError().code != 626) return ndberror("execute key=%d", key); } else { delcnt++; } ndb->closeTransaction(con); } con = 0; op = 0; ndbout << "deleted " << delcnt << endl; if (xverbose) ndbout << "- insert" << endl; for (key = 0; key < opercnt; key++) { int off = makeOff(key); if ((con = ndb->startTransaction()) == 0) return ndberror("startTransaction key=%d", key); if ((op = con->getNdbOperation(tab)) == 0)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -