#include <stdio.h>
#include <stdlib.h>
#include "example_fcns.h"
#include "core28_structs.h"
#include "core28_cat.h"
#define RAMPUPTIME 15
#define TPS 5
#define NUM_BRANCHES 1
#define NUM_TELLERS 10
#define NUM_ACCOUNTS 100000L
#define STEADYSTATE 60
const char *const description =
"Performance Test (inmemory) using TPC-B test specifications.";
{
perfTimer_t timer;
BRANCHES brnRec;
printf ("Populate database with %d TPS configuration:\t", TPS);
timeMeasureBegin (&timer);
for (brnRec.bid = 0; brnRec.bid < TPS; brnRec.bid++)
{
int ii;
print_error (rc);
{
brnRec.bbalance = 0.0;
hDB, TABLE_BRANCHES, &brnRec, sizeof (brnRec), NULL);
print_error (rc);
for (ii = 0; rc ==
sOKAY && ii < NUM_TELLERS; ii++)
{
TELLERS telRec;
telRec.bid = brnRec.bid;
telRec.tbalance = 0.0;
telRec.tid = (NUM_TELLERS * brnRec.bid) + ii;
hDB, TABLE_TELLERS, &telRec, sizeof (telRec), NULL);
print_error (rc);
}
for (ii = 0; rc ==
sOKAY && ii < NUM_ACCOUNTS; ii++)
{
ACCOUNTS accRec;
accRec.bid = brnRec.bid;
accRec.abalance = 0.0;
accRec.aid = (NUM_ACCOUNTS * brnRec.bid) + ii;
hDB, TABLE_ACCOUNTS, &accRec, sizeof (accRec), NULL);
print_error (rc);
}
}
}
timeMeasureEnd (&timer);
printf ("%u milliseconds\n", timeMeasureDiff (&timer));
return rc;
}
unsigned int *elapsedTime)
{
perfTimer_t timer;
double bal;
struct
{
int bid;
int aid;
int tid;
double delta;
} historyRow;
TELLERS_TELLERS_PK_KEY tellerKey;
ACCOUNTS_ACCOUNTS_PK_KEY acctKey;
historyRow.delta = (double) (rand () / (65536.0 * 65536.0));
historyRow.tid = (int) ((rand () % (TPS * NUM_TELLERS)));
historyRow.bid = historyRow.tid / NUM_TELLERS;
historyRow.aid = (unsigned int) rand () % NUM_ACCOUNTS;
timeMeasureBegin (&timer);
do
{
print_error (rc);
acctKey.aid = historyRow.aid;
hDB, COL_ACCOUNTS_AID, &acctKey, sizeof (acctKey), &cursor);
print_error (rc);
cursor, COL_ACCOUNTS_ABALANCE, &bal, sizeof (bal), NULL);
print_error (rc);
bal += historyRow.delta;
cursor, COL_ACCOUNTS_ABALANCE, &bal, sizeof (bal));
print_error (rc);
tellerKey.tid = historyRow.tid;
hDB, COL_TELLERS_TID, &tellerKey, sizeof (tellerKey), &cursor);
print_error (rc);
cursor, COL_TELLERS_TBALANCE, &bal, sizeof (bal), NULL);
print_error (rc);
bal += historyRow.delta;
cursor, COL_TELLERS_TBALANCE, &bal, sizeof (bal));
print_error (rc);
print_error (rc);
brnCursor, COL_BRANCHES_BBALANCE, &bal, sizeof (bal), NULL);
print_error (rc);
bal += historyRow.delta;
brnCursor, COL_BRANCHES_BBALANCE, &bal, sizeof (bal));
print_error (rc);
print_error (rc);
timeMeasureEnd (&timer);
if (cursor)
if (brnCursor)
*elapsedTime = timeMeasureDiff (&timer);
return rc;
}
{
uint64_t count;
printf ("\nTPC-B Database Statistics:\n");
print_error (rc);
{
print_error (rc);
{
print_error (rc);
printf (
"\tBRANCHES table contains %u rows\n", (unsigned int) count);
}
{
print_error (rc);
}
{
print_error (rc);
printf ("\tTELLERS table contains %u rows\n", (unsigned int) count);
}
{
print_error (rc);
}
{
print_error (rc);
printf (
"\tACCOUNTS table contains %u rows\n", (unsigned int) count);
}
if (cursor)
}
return rc;
}
int main_core28 (int argc, const char *const *argv)
{
srand (100);
print_error (rc);
{
rc = exampleOpenEmptyDatabase (&hTFS, &hDB, "core28", core28_cat);
{
rc = populateDatabase (hDB);
{
perfTimer_t timer;
unsigned int thisTrans;
unsigned int minTrans = (unsigned int) -1;
unsigned int maxTrans = 0;
unsigned int numTrans = 0;
unsigned int totTrans = 0;
printf ("Perform RAMP-UP for %d seconds\n", RAMPUPTIME);
timeMeasureBegin (&timer);
{
timeMeasureEnd (&timer);
if (timeMeasureDiff (&timer) > (RAMPUPTIME * 1000))
break;
rc = do_trans (hDB, &thisTrans);
}
printf ("Perform TPC-B test for %d seconds\n", STEADYSTATE);
timeMeasureBegin (&timer);
{
timeMeasureEnd (&timer);
if (timeMeasureDiff (&timer) > (STEADYSTATE * 1000))
break;
rc = do_trans (hDB, &thisTrans);
minTrans =
RDM_MIN (minTrans, thisTrans);
maxTrans =
RDM_MAX (maxTrans, thisTrans);
totTrans += thisTrans;
numTrans++;
}
if (totTrans != 0)
{
printf (
"Steady state results: %.2f TPS-B\n\n",
(double) numTrans / (double) totTrans * 1000.0);
}
printf (
"\tMinimum transaction time: %u milliseconds\n", minTrans);
printf (
"\tMaximum transaction time: %u milliseconds\n", maxTrans);
printf (
"\tTotal number of transactions measured: %u\n", numTrans);
readDbStats (hDB);
}
exampleCleanup (hTFS, hDB);
}
}
return (int) rc;
}