⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdatabuffers.cpp

📁 mysql-5.0.22.tar.gz源码包
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* 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 + -