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

📄 tpcbexample.cpp

📁 File system using stacked.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/*- * See the file LICENSE for redistribution information. * * Copyright (c) 1997-2002 *	Sleepycat Software.  All rights reserved. * * $Id: TpcbExample.cpp,v 1.1.1.1 2004/08/19 23:53:56 gopalan Exp $ */#include <sys/types.h>#include <errno.h>#include <stdlib.h>#include <string.h>#include <time.h>#include <iostream>#include <iomanip>#include <db_cxx.h>using std::cout;using std::cerr;typedef enum { ACCOUNT, BRANCH, TELLER } FTYPE;static int	  invarg(int, char *);u_int32_t random_id(FTYPE, u_int32_t, u_int32_t, u_int32_t);u_int32_t random_int(u_int32_t, u_int32_t);static int	  usage(void);int verbose;const char *progname = "TpcbExample";                       // Program name.class TpcbExample : public DbEnv{public:	void populate(int, int, int, int);	void run(int, int, int, int);	int txn(Db *, Db *, Db *, Db *,		int, int, int);	void populateHistory(Db *, int, u_int32_t, u_int32_t, u_int32_t);	void populateTable(Db *, u_int32_t, u_int32_t, int, const char *);	// Note: the constructor creates a DbEnv(), which is	// not fully initialized until the DbEnv::open() method	// is called.	//	TpcbExample(const char *home, int cachesize,		    int initializing, int flags);private:	static const char FileName[];	// no need for copy and assignment	TpcbExample(const TpcbExample &);	void operator = (const TpcbExample &);};//// This program implements a basic TPC/B driver program.  To create the// TPC/B database, run with the -i (init) flag.  The number of records// with which to populate the account, history, branch, and teller tables// is specified by the a, s, b, and t flags respectively.  To run a TPC/B// test, use the n flag to indicate a number of transactions to run (note// that you can run many of these processes in parallel to simulate a// multiuser test run).//#define	TELLERS_PER_BRANCH      100#define	ACCOUNTS_PER_TELLER     1000#define	HISTORY_PER_BRANCH	2592000/* * The default configuration that adheres to TPCB scaling rules requires * nearly 3 GB of space.  To avoid requiring that much space for testing, * we set the parameters much lower.  If you want to run a valid 10 TPS * configuration, define VALID_SCALING. */#ifdef	VALID_SCALING#define	ACCOUNTS	 1000000#define	BRANCHES	      10#define	TELLERS		     100#define	HISTORY		25920000#endif#ifdef	TINY#define	ACCOUNTS	    1000#define	BRANCHES	      10#define	TELLERS		     100#define	HISTORY		   10000#endif#if !defined(VALID_SCALING) && !defined(TINY)#define	ACCOUNTS	  100000#define	BRANCHES	      10#define	TELLERS		     100#define	HISTORY		  259200#endif#define	HISTORY_LEN	    100#define	RECLEN		    100#define	BEGID		1000000struct Defrec {	u_int32_t   id;	u_int32_t   balance;	u_int8_t    pad[RECLEN - sizeof(u_int32_t) - sizeof(u_int32_t)];};struct Histrec {	u_int32_t   aid;	u_int32_t   bid;	u_int32_t   tid;	u_int32_t   amount;	u_int8_t    pad[RECLEN - 4 * sizeof(u_int32_t)];};intmain(int argc, char *argv[]){	unsigned long seed;	int accounts, branches, tellers, history;	int iflag, mpool, ntxns, txn_no_sync;	const char *home;	char *endarg;	home = "TESTDIR";	accounts = branches = history = tellers = 0;	txn_no_sync = 0;	mpool = ntxns = 0;	verbose = 0;	iflag = 0;	seed = (unsigned long)time(NULL);	for (int i = 1; i < argc; ++i) {		if (strcmp(argv[i], "-a") == 0) {			// Number of account records			if ((accounts = atoi(argv[++i])) <= 0)				return (invarg('a', argv[i]));		}		else if (strcmp(argv[i], "-b") == 0) {			// Number of branch records			if ((branches = atoi(argv[++i])) <= 0)				return (invarg('b', argv[i]));		}		else if (strcmp(argv[i], "-c") == 0) {			// Cachesize in bytes			if ((mpool = atoi(argv[++i])) <= 0)				return (invarg('c', argv[i]));		}		else if (strcmp(argv[i], "-f") == 0) {			// Fast mode: no txn sync.			txn_no_sync = 1;		}		else if (strcmp(argv[i], "-h") == 0) {			// DB  home.			home = argv[++i];		}		else if (strcmp(argv[i], "-i") == 0) {			// Initialize the test.			iflag = 1;		}		else if (strcmp(argv[i], "-n") == 0) {			// Number of transactions			if ((ntxns = atoi(argv[++i])) <= 0)				return (invarg('n', argv[i]));		}		else if (strcmp(argv[i], "-S") == 0) {			// Random number seed.			seed = strtoul(argv[++i], &endarg, 0);			if (*endarg != '\0')				return (invarg('S', argv[i]));		}		else if (strcmp(argv[i], "-s") == 0) {			// Number of history records			if ((history = atoi(argv[++i])) <= 0)				return (invarg('s', argv[i]));		}		else if (strcmp(argv[i], "-t") == 0) {			// Number of teller records			if ((tellers = atoi(argv[++i])) <= 0)				return (invarg('t', argv[i]));		}		else if (strcmp(argv[i], "-v") == 0) {			// Verbose option.			verbose = 1;		}		else {			return (usage());		}	}	srand((unsigned int)seed);	accounts = accounts == 0 ? ACCOUNTS : accounts;	branches = branches == 0 ? BRANCHES : branches;	tellers = tellers == 0 ? TELLERS : tellers;	history = history == 0 ? HISTORY : history;	if (verbose)		cout << (long)accounts << " Accounts, "		     << (long)branches << " Branches, "		     << (long)tellers << " Tellers, "		     << (long)history << " History\n";	try {		// Initialize the database environment.		// Must be done in within a try block, unless you		// change the error model in the environment options.		//		TpcbExample app(home, mpool, iflag,		                txn_no_sync ? DB_TXN_NOSYNC : 0);		if (iflag) {			if (ntxns != 0)				return (usage());			app.populate(accounts, branches, history, tellers);		}		else {			if (ntxns == 0)				return (usage());			app.run(ntxns, accounts, branches, tellers);		}		app.close(0);		return (EXIT_SUCCESS);	}	catch (DbException &dbe) {		cerr << "TpcbExample: " << dbe.what() << "\n";		return (EXIT_FAILURE);	}}static intinvarg(int arg, char *str){	cerr << "TpcbExample: invalid argument for -"	     << (char)arg << ": " << str << "\n";	return (EXIT_FAILURE);}static intusage(){	cerr << "usage: TpcbExample [-fiv] [-a accounts] [-b branches]\n"	     << "                   [-c cachesize] [-h home] [-n transactions ]\n"	     << "                   [-S seed] [-s history] [-t tellers]\n";	return (EXIT_FAILURE);}TpcbExample::TpcbExample(const char *home, int cachesize,			 int initializing, int flags):	DbEnv(0){	u_int32_t local_flags;	set_error_stream(&cerr);	set_errpfx("TpcbExample");	(void)set_cachesize(0, cachesize == 0 ?	                    4 * 1024 * 1024 : (u_int32_t)cachesize, 0);	if (flags & (DB_TXN_NOSYNC))		set_flags(DB_TXN_NOSYNC, 1);	flags &= ~(DB_TXN_NOSYNC);	local_flags = flags | DB_CREATE | DB_INIT_MPOOL;	if (!initializing)		local_flags |= DB_INIT_TXN | DB_INIT_LOCK | DB_INIT_LOG;	open(home, local_flags, 0);}//// Initialize the database to the specified number of accounts, branches,// history records, and tellers.//voidTpcbExample::populate(int accounts, int branches, int history, int tellers){	Db *dbp;	int err;	u_int32_t balance, idnum;	u_int32_t end_anum, end_bnum, end_tnum;	u_int32_t start_anum, start_bnum, start_tnum;	idnum = BEGID;	balance = 500000;	dbp = new Db(this, 0);	dbp->set_h_nelem((unsigned int)accounts);	if ((err = dbp->open(NULL, "account", NULL, DB_HASH,	                     DB_CREATE | DB_TRUNCATE, 0644)) != 0) {		DbException except("Account file create failed", err);		throw except;	}	start_anum = idnum;	populateTable(dbp, idnum, balance, accounts, "account");	idnum += accounts;	end_anum = idnum - 1;	if ((err = dbp->close(0)) != 0) {		DbException except("Account file close failed", err);		throw except;	}	delete dbp;	if (verbose)		cout << "Populated accounts: "		     << (long)start_anum << " - " << (long)end_anum << "\n";	dbp = new Db(this, 0);	//	// Since the number of branches is very small, we want to use very	// small pages and only 1 key per page.  This is the poor-man's way	// of getting key locking instead of page locking.	//	dbp->set_h_ffactor(1);	dbp->set_h_nelem((unsigned int)branches);	dbp->set_pagesize(512);	if ((err = dbp->open(NULL, "branch", NULL, DB_HASH,	                     DB_CREATE | DB_TRUNCATE, 0644)) != 0) {		DbException except("Branch file create failed", err);		throw except;	}	start_bnum = idnum;	populateTable(dbp, idnum, balance, branches, "branch");	idnum += branches;	end_bnum = idnum - 1;

⌨️ 快捷键说明

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