rt-thread/components/tpcc-sqlite/support.c

186 lines
3.7 KiB
C

/*
* support.c
* routines needed for the tpcc loading and transaction programs
*/
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <ctype.h>
#include "tpc.h"
// static int nums[CUST_PER_DIST];
static int *nums=NULL;
static int perm_count;
void SetSeed (int seed)
{
srand(seed);
}
/*
* return number uniformly distributed b/w min and max, inclusive
*/
int RandomNumber (int min, int max)
{ int rd=rand();
// printf("randnumber %d\n",rd);
return min + (rd % ((max - min) + 1));
}
/*
* non uniform random -- see p. 15
*
* the constant C depends on which value of A is passed, but the same
* value of C should be used for all calls with the same value of
* A. however, we know in advance which values of A will be used.
*/
int NURand (unsigned A, unsigned x, unsigned y)
{
static int first = 1;
unsigned C, C_255, C_1023, C_8191;
if (first) {
C_255 = RandomNumber(0, 255);
C_1023 = RandomNumber(0, 1023);
C_8191 = RandomNumber(0, 8191);
first = 0;
}
switch (A) {
case 255: C = C_255; break;
case 1023: C = C_1023; break;
case 8191: C = C_8191; break;
default:
fprintf(stderr,
"NURand: unexpected value (%d) of A used\n",
A);
abort();
}
return (int)
(((RandomNumber(0, A) | RandomNumber(x, y)) + C) % (y-x+1)) + x;
}
/*
* p. 54
*
* make a ``random a-string'': a string of random alphanumeric
* characters of a random length of minimum x, maximum y, and
* mean (y+x)/2
*/
int MakeAlphaString (int x, int y, char str[])
{
static char *alphanum = "0123456789"
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
"abcdefghijklmnopqrstuvwxyz";
int arrmax = 61; /* index of last array element */
register int i, len;
len = RandomNumber(x, y);
for (i = 0; i < len; i++)
str[i] = alphanum[RandomNumber(0, arrmax)];
return len;
}
/*
* like MakeAlphaString, only numeric characters only
*/
int MakeNumberString (int x, int y, char str[])
{
static char *numeric = "0123456789";
int arrmax = 9;
register int i, len;
len = RandomNumber(x, y);
for (i = 0; i < len; i++)
str[i] = numeric[RandomNumber(0, arrmax)];
return len;
}
/*
* turn system time into database format
* the format argument should be a strftime() format string that produces
* a datetime string acceptable to the database
*/
void gettimestamp (char str[], char *format, size_t len)
{
time_t t;
struct tm *datetime;
t = time(NULL);
datetime = localtime(&t);
if ( !strftime(str, len, format, datetime) ) {
fprintf(stderr, "error writing timestamp to string\n");
abort();
}
}
/*
* permute the list of customer ids for the order table
*/
void InitPermutation (void)
{
if (nums==NULL){
nums=malloc(3000*4);
}
int *cur;
int i,j;
perm_count = 0;
/* initialize with consecutive values [1..ORD_PER_DIST] */
for (i = 0, cur = nums; i < ORD_PER_DIST; i++, cur++) {
*cur = i + 1;
}
/* now, shuffle */
for (i = 0; i < ORD_PER_DIST-1; i++) {
j = (int)RandomNumber(i+1, ORD_PER_DIST-1);
swap_int(nums[i], nums[j]);
}
}
int GetPermutation (void)
{
if (nums==NULL){
nums=malloc(3000*4);
}
if ( perm_count >= ORD_PER_DIST ) {
fprintf(stderr, "GetPermutation: past end of list!\n");
abort();
}
return nums[perm_count++];
}
/*==================================================================+
| ROUTINE NAME
| Lastname
| DESCRIPTION
| TPC-C Lastname Function.
| ARGUMENTS
| num - non-uniform random number
| name - last name string
+==================================================================*/
void Lastname(num, name)
int num;
char *name;
{
static char *n[] =
{"BAR", "OUGHT", "ABLE", "PRI", "PRES",
"ESE", "ANTI", "CALLY", "ATION", "EING"};
strcpy(name,n[num/100]);
strcat(name,n[(num/10)%10]);
strcat(name,n[num%10]);
return;
}