Commit 0b5c8913 authored by Gaurav Kukreja's avatar Gaurav Kukreja

Assignment 1: FakeDB, Main Mem based DB

Runs TPC-C Benchmarking tool
Signed-off-by: 's avatarGaurav Kukreja <mailme.gaurav@gmail.com>
parent e6d3b92e
CC=g++
CCFLAGS=-O0
fakedb: main.cpp data_migrate.cpp schema_methods.cpp neworder.cpp oltp.cpp schema_constructors.cpp data_migrate.h schema.h oltp.h neworder.h
$(CC) $(CCFLAGS) $^ -o $@
clean:
rm -rf fakedb
\ No newline at end of file
#include <iostream>
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <list>
#include <stdio.h>
#include "schema.h"
//#include "data_migrate.h"
using namespace std;
char CUSTOMER_TBL_FILE[40]="./../../tables/tpcc_customer.tbl";
char DISTRICT_TBL_FILE[40]="./../../tables/tpcc_district.tbl";
char HISTORY_TBL_FILE[40]="./../../tables/tpcc_history.tbl";
char ITEM_TBL_FILE[40]="./../../tables/tpcc_item.tbl";
char NEWORDER_TBL_FILE[40]="./../../tables/tpcc_neworder.tbl";
char ORDERLINE_TBL_FILE[40]="./../../tables/tpcc_orderline.tbl";
char ORDER_TBL_FILE[40]="./../../tables/tpcc_order.tbl";
char STOCK_TBL_FILE[40]="./../../tables/tpcc_stock.tbl";
char WAREHOUSE_TBL_FILE[40]="./../../tables/tpcc_warehouse.tbl";
list<customer> customer_list;
list<district> district_list;
list<history> history_list;
list<item> item_list;
list<neworder> neworder_list;
list<orderline> orderline_list;
list<order> order_list;
list<stock> stock_list;
list<warehouse> warehouse_list;
int load_customer_from_file() {
FILE *customer_tbl;
int count=0;
customer_tbl=fopen(CUSTOMER_TBL_FILE, "r");
while(!feof(customer_tbl)) {
customer temp_customer;
if(temp_customer.parse(&customer_tbl)==0)
{
customer_list.push_front(temp_customer);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(customer_tbl);
return 0;
}
int load_district_from_file() {
FILE *district_tbl;
int count=0;
district_tbl=fopen(DISTRICT_TBL_FILE, "r");
while(!feof(district_tbl)) {
district temp_district;
if(temp_district.parse(&district_tbl)==0)
{
district_list.push_front(temp_district);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(district_tbl);
return 0;
}
int load_history_from_file() {
FILE *history_tbl;
int count=0;
history_tbl=fopen(HISTORY_TBL_FILE, "r");
while(!feof(history_tbl)) {
history temp_history;
if(temp_history.parse(&history_tbl)==0)
{
history_list.push_front(temp_history);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(history_tbl);
return 0;
}
int load_item_from_file() {
FILE *item_tbl;
int count=0;
item_tbl=fopen(ITEM_TBL_FILE, "r");
while(!feof(item_tbl)) {
item temp_item;
if(temp_item.parse(&item_tbl)==0)
{
item_list.push_front(temp_item);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(item_tbl);
return 0;
}
int load_neworder_from_file() {
FILE *neworder_tbl;
int count=0;
neworder_tbl=fopen(NEWORDER_TBL_FILE, "r");
while(!feof(neworder_tbl)) {
neworder temp_neworder;
if(temp_neworder.parse(&neworder_tbl)==0)
{
neworder_list.push_front(temp_neworder);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(neworder_tbl);
return 0;
}
int load_order_from_file() {
FILE *order_tbl;
int count=0;
order_tbl=fopen(ORDER_TBL_FILE, "r");
while(!feof(order_tbl)) {
order temp_order;
if(temp_order.parse(&order_tbl)==0)
{
order_list.push_front(temp_order);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(order_tbl);
return 0;
}
int load_orderline_from_file() {
FILE *orderline_tbl;
int count=0;
orderline_tbl=fopen(ORDERLINE_TBL_FILE, "r");
while(!feof(orderline_tbl)) {
orderline temp_orderline;
if(temp_orderline.parse(&orderline_tbl)==0)
{
orderline_list.push_front(temp_orderline);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(orderline_tbl);
return 0;
}
int load_stock_from_file() {
FILE *stock_tbl;
int count=0;
stock_tbl=fopen(STOCK_TBL_FILE, "r");
while(!feof(stock_tbl)) {
stock temp_stock;
if(temp_stock.parse(&stock_tbl)==0)
{
stock_list.push_front(temp_stock);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(stock_tbl);
return 0;
}
int load_warehouse_from_file() {
FILE *warehouse_tbl;
int count=0;
warehouse_tbl=fopen(WAREHOUSE_TBL_FILE, "r");
while(!feof(warehouse_tbl)) {
warehouse temp_warehouse;
if(temp_warehouse.parse(&warehouse_tbl)==0)
{
warehouse_list.push_front(temp_warehouse);
count++;
}
else
{
//printf("EOF found\n");
}
}
printf("No. of entries = %d :: %s\n",count,__func__);
fclose(warehouse_tbl);
return 0;
}
\ No newline at end of file
#ifndef _DATA_MIGRATE_H_
#define _DATA_MIGRATE_H_
#include <list>
#include "schema.h"
using namespace std;
int load_customer_from_file();
int load_district_from_file();
int load_history_from_file();
int load_item_from_file();
int load_neworder_from_file();
int load_order_from_file();
int load_orderline_from_file();
int load_stock_from_file();
int load_warehouse_from_file();
extern list<customer> customer_list;
extern list<district> district_list;
extern list<history> history_list;
extern list<item> item_list;
extern list<neworder> neworder_list;
extern list<orderline> orderline_list;
extern list<order> order_list;
extern list<stock> stock_list;
extern list<warehouse> warehouse_list;
#endif //_DATA_MIGRATE_H_
\ No newline at end of file
#include <iostream>
#include <cstdlib> //for random
#include <stdint.h>
#include <stdlib.h>
#include <fcntl.h>
#include <list>
#include <ctime>
#include "schema.h"
#include "data_migrate.h"
#include "oltp.h"
using namespace std;
ostream &operator<<(ostream &output, const warehouse &o)
{
output << o.w_id << ' ' << o.w_name << ' ' << o.w_zip << endl;
return output;
}
int warehouses=5;
int main(int argc, char* argv[]) {
load_customer_from_file();
load_district_from_file();
load_history_from_file();
load_item_from_file();
load_neworder_from_file();
load_order_from_file();
load_orderline_from_file();
load_stock_from_file();
load_warehouse_from_file();
//while(1) {
int choice;
list<warehouse>::iterator i;
for(i=warehouse_list.begin(); i !=warehouse_list.end(); ++i)
cout << *i << " "; // print with overloaded operator
scanf("%d",&choice);
for(double i=0;i<1000;i++)
newOrderRandom(time(NULL), random()%warehouses+1);
/*
switch(choice) {
case 1: printf("\nWhich table to print?\n");
printf("1. customer\n");
printf("2. district\n");
printf("3. history\n");
printf("4. item\n");
printf("5. neworder\n");
printf("6. order\n");
printf("7. orderline\n");
printf("8. stock\n");
printf("9. warehouse\n");
scanf("%d",&choice);
switch(choice) {
case 1: display_customer();
break;
case 2: display_district();
break;
case 3: display_history();
break;
case 4: display_item();
break;
case 5: display_neworder();
break;
case 6: display_order();
break;
case 7: display_orderline();
break;
case 8: display_stock();
break;
case 9: display_warehouse();
break;
default: printf("Wrong Option\n");
}
break;
case 2: return 0;
default: printf("Wrong Option\n");
}
}
*/
return 0;
}
\ No newline at end of file
#include "schema.h"
#include "data_migrate.h"
#include <list>
using namespace std;
void newOrder(int w_id, int d_id, int c_id, int items, int supware[15], int itemid[15], int qty[15], uint64_t datetime) {
list<warehouse>::iterator ware_iter;
list<customer>::iterator cust_iter;
list<district>::iterator dist_iter;
printf("w_id is %d\n",w_id);
for(ware_iter=warehouse_list.begin(); (ware_iter!=warehouse_list.end() && (ware_iter->w_id!=w_id)); ++ware_iter);
for(cust_iter=customer_list.begin(); (cust_iter!=customer_list.end() && (cust_iter->c_w_id!=w_id && cust_iter->c_d_id!=d_id && cust_iter->c_id!=c_id)); ++cust_iter);
for(dist_iter=district_list.begin(); cust_iter!=customer_list.end() && (dist_iter->d_w_id!=w_id && dist_iter->d_id!=d_id); ++dist_iter);
int all_local = 1;
for(int i=0;i<items;i++) {
if(w_id!=supware[i])
all_local=0;
}
int o_id=dist_iter->d_next_o_id; //d_next_o_id as o_id
order *order_new=new order(o_id,d_id,w_id,c_id,datetime,0,items,all_local);
order_list.push_front(*order_new);
neworder *neworder_new=new neworder(o_id,d_id,w_id);
neworder_list.push_front(*neworder_new);
for(int i=0;i<items;i++) {
list<item>::iterator item_iter;
list<stock>::iterator stock_iter;
for(item_iter=item_list.begin();item_iter!=item_list.end() && item_iter->i_id!=itemid[i];++item_iter);
for(stock_iter=stock_list.begin();stock_iter!=stock_list.end() && (stock_iter->s_w_id!=supware[i] && stock_iter->s_i_id!=itemid[i]);++stock_iter);
if(stock_iter->s_quantity > qty[i])
stock_iter->s_quantity = stock_iter->s_quantity - qty[i];
else
stock_iter->s_quantity = stock_iter->s_quantity + 91 - qty[i];
if(supware[i] != w_id)
stock_iter->s_remote_cnt = stock_iter->s_remote_cnt +1;
else
stock_iter->s_order_cnt = stock_iter->s_order_cnt +1;
uint64_t ol_amount=qty[i]*(item_iter->i_price)*(1.0+(ware_iter->w_tax)*(1.0-(cust_iter->c_discount)));
char s_dist[25];
switch(d_id) {
case 1: strcpy(stock_iter->s_dist_01,s_dist);
break;
case 2: strcpy(stock_iter->s_dist_02,s_dist);
break;
case 3: strcpy(stock_iter->s_dist_03,s_dist);
break;
case 4: strcpy(stock_iter->s_dist_04,s_dist);
break;
case 5: strcpy(stock_iter->s_dist_05,s_dist);
break;
case 6: strcpy(stock_iter->s_dist_06,s_dist);
break;
case 7: strcpy(stock_iter->s_dist_07,s_dist);
break;
case 8: strcpy(stock_iter->s_dist_08,s_dist);
break;
case 9: strcpy(stock_iter->s_dist_09,s_dist);
break;
case 10: strcpy(stock_iter->s_dist_10,s_dist);
break;
default: break;
}
orderline *orderline_new=new orderline(o_id,d_id,w_id,i+1,itemid[i],supware[i],0,qty[i],ol_amount,s_dist);
orderline_list.push_front(*orderline_new);
}
}
/*
create transaction newOrder ( integer w_id, integer d_id, integer c_id, integer items, array(15) integer supware, array(15) integer itemid, array(15) integer qty, timestamp datetime)
{
select w_tax from warehouse w where w.w_id=w_id;
select c_discount from customer c where c_w_id=w_id and c_d_id=d_id and c.c_id=c_id;
select d_next_o_id as o_id,d_tax from district d where d_w_id=w_id and d.d_id=d_id;
update district set d_next_o_id=o_id+1 where d_w_id=w_id and district.d_id=d_id;
var integer all_local = 1;
forsequence (index between 0 and items-1) {
if (w_id<>supware[index])
all_local=0;
}
insert into "order" values (o_id,d_id,w_id,c_id,datetime,0,items,all_local);
insert into neworder values (o_id,d_id,w_id);
forsequence (index between 0 and items-1) {
select i_price from item where i_id=itemid[index];
select s_quantity,s_remote_cnt,s_order_cnt,case d_id when 1 then s_dist_01 when 2 then s_dist_02 when 3 then s_dist_03 when 4 then s_dist_04 when 5 then s_dist_05 when 6 then s_dist_06 when 7 then s_dist_07 when 8 then s_dist_08 when 9 then s_dist_09 when 10 then s_dist_10 end as s_dist from stock where s_w_id=supware[index] and s_i_id=itemid[index];
if (s_quantity>qty[index]) {
update stock set s_quantity=s_quantity-qty[index] where s_w_id=supware[index] and s_i_id=itemid[index];
} else {
update stock set s_quantity=s_quantity+91-qty[index] where s_w_id=supware[index] and s_i_id=itemid[index];
}
if (supware[index]<>w_id) {
update stock set s_remote_cnt=s_remote_cnt+1 where s_w_id=w_id and s_i_id=itemid[index];
} else {
update stock set s_order_cnt=s_order_cnt+1 where s_w_id=w_id and s_i_id=itemid[index];
}
var numeric(6,2) ol_amount=qty[index]*i_price*(1.0+w_tax+d_tax)*(1.0-c_discount);
insert into orderline values (o_id,d_id,w_id,index+1,itemid[index],supware[index],0,qty[index],ol_amount,s_dist);
}
commit;
};
*/
#ifndef _NEWORDER_H_
#define _NEWORDER_H_
#include <stdint.h> //for uint64_t
extern void newOrder(int w_id, int d_id, int c_id, int items, int supware[15], int itemid[15], int qty[15], uint64_t datetime);
#endif //_NEWORDER_H_
\ No newline at end of file
create transaction newOrder ( integer w_id, integer d_id, integer c_id, integer items, array(15) integer supware, array(15) integer itemid, array(15) integer qty, timestamp datetime)
{
select w_tax from warehouse w where w.w_id=w_id;
select c_discount from customer c where c_w_id=w_id and c_d_id=d_id and c.c_id=c_id;
select d_next_o_id as o_id,d_tax from district d where d_w_id=w_id and d.d_id=d_id;
update district set d_next_o_id=o_id+1 where d_w_id=w_id and district.d_id=d_id;
var integer all_local = 1;
forsequence (index between 0 and items-1) {
if (w_id<>supware[index])
all_local=0;
}
insert into "order" values (o_id,d_id,w_id,c_id,datetime,0,items,all_local);
insert into neworder values (o_id,d_id,w_id);
forsequence (index between 0 and items-1) {
select i_price from item where i_id=itemid[index];
select s_quantity,s_remote_cnt,s_order_cnt,case d_id when 1 then s_dist_01 when 2 then s_dist_02 when 3 then s_dist_03 when 4 then s_dist_04 when 5 then s_dist_05 when 6 then s_dist_06 when 7 then s_dist_07 when 8 then s_dist_08 when 9 then s_dist_09 when 10 then s_dist_10 end as s_dist from stock where s_w_id=supware[index] and s_i_id=itemid[index];
if (s_quantity>qty[index]) {
update stock set s_quantity=s_quantity-qty[index] where s_w_id=supware[index] and s_i_id=itemid[index];
} else {
update stock set s_quantity=s_quantity+91-qty[index] where s_w_id=supware[index] and s_i_id=itemid[index];
}
if (supware[index]<>w_id) {
update stock set s_remote_cnt=s_remote_cnt+1 where s_w_id=w_id and s_i_id=itemid[index];
} else {
update stock set s_order_cnt=s_order_cnt+1 where s_w_id=w_id and s_i_id=itemid[index];
}
var numeric(6,2) ol_amount=qty[index]*i_price*(1.0+w_tax+d_tax)*(1.0-c_discount);
insert into orderline values (o_id,d_id,w_id,index+1,itemid[index],supware[index],0,qty[index],ol_amount,s_dist);
}
commit;
};
#include <stdint.h> //for uint64_t
#include <ctime> //for time_t
#include <string.h> //For strcpy and strcat
#include <cstdlib> //for random
#include "neworder.h" //for neworder()
#include <stdio.h> // DEBUG for printf
using namespace std;
//create constant integer warehouses = 5;
static int warehouses = 5;
/*
create function varchar(20) genName(integer id)
{
var array(10) varchar(5) parts = {'BAR','OUGHT','ABLE','PRI','PRES','ESE','ANTI','CALLY','ATION','EING'};
return parts[(id/100)%10]+parts[(id/10)%10]+parts[id%10];
};
*/
char* genName(int id) {
char parts[10][6] = {"BAR","OUGHT","ABLE","PRI","PRES","ESE","ANTI","CALLY","ATION","EING"};
return strcat(strcat(parts[(id/100)%10], parts[(id/10)%10]),parts[id%10]);
}
/*
create function numeric(6,2) randomnumeric62(numeric(6,2) min,numeric(6,2) max)
{
return min+((cast (random%cast ((max-min)*100) as integer) as numeric(6,2))/100);
};
*/
/*
create function integer nurand(integer A,integer x,integer y)
{
return ((((random%A)|(random%(y-x+1)+x))+42)%(y-x+1))+x;
};
*/
int nurand(int A, int x, int y) {
return ((((random()%A)|(random()%(y-x+1)+x))+42)%(y-x+1))+x;
}
/*
create function integer urand(integer min,integer max)
{
return (random%(max-min+1))+min;
};
*/
int urand(int min, int max)
{
return (random()%(max-min+1))+min;
}
/*
create function integer urandexcept(integer min,integer max,integer v)
{
if (max<=min)
return min;
var integer r=(random%(max-min))+min;
if (r>=v)
return r+1; else
return r;
};
*/
int urandexcept(int min, int max, int v) {
if(max<=min)
return min;
int r=(random()%(max-min))+min;
if(r>=v)
return r+1;
else
return r;
}
/*
create function void newOrderRandom(timestamp now,integer w_id)
{
var integer d_id=execute urand(1,10);
var integer c_id=execute nurand(1023,1,3000);
var integer ol_cnt=execute urand(5,15);
var array(15) integer supware;
var array(15) integer itemid;
var array(15) integer qty;
forsequence (index between 0 and ol_cnt-1) {
if (execute urand(1,100)>1)
supware[index]=w_id; else
supware[index]=execute urandexcept(1,warehouses,w_id);
itemid[index]=execute nurand(8191,1,100000);
qty[index]=execute urand(1,10);
}
forsequence (index between ol_cnt and 14) {
supware[index]=w_id;
}
execute newOrder(w_id,d_id,c_id,ol_cnt,supware,itemid,qty,now);
};
*/
void newOrderRandom(time_t now, int w_id) {
int d_id=urand(1,10);
int c_id=nurand(1023,1,3000);
int ol_cnt=urand(5,15);
int supware[15];
int itemid[15];
int qty[15];
printf("ol_cnt is %d\n",ol_cnt);
for(int i=0;i<ol_cnt;i++) {
if(urand(1,100) > 1)
supware[i]=w_id;
else
supware[i]=urandexcept(1,warehouses,w_id);
itemid[i]=nurand(8191,1,100000);
qty[i]=urand(1,10);
}
for(int i=ol_cnt;i<15;i++) {
supware[i]=w_id;
}
newOrder(w_id,d_id,c_id,ol_cnt,supware,itemid,qty,(uint64_t)now);
}
/*
create function void paymentRandom(timestamp now,integer w_id)
{
var integer d_id=execute urand(1,10);
var integer c_w_id;
var integer c_d_id;
if (execute urand(1,100)<=85) {
c_w_id=w_id;
c_d_id=d_id;
} else {
c_w_id=execute urandexcept(1,warehouses,w_id);
c_d_id=execute urand(1,10);
}
var numeric(6,2) h_amount=execute randomnumeric62(1.00,5000.00);
var timestamp h_date=now;
if (execute urand(1,100)<=60) {
execute paymentByName(w_id,d_id,c_w_id,c_d_id,execute genName(execute nurand(255,0,999)),h_date,h_amount,now);
} else {
execute paymentById(w_id,d_id,c_w_id,c_d_id,execute nurand(1023,1,3000),h_date,h_amount,now);
}
};
create function void ostatRandom(integer w_id)
{
var integer d_id=execute urand(1,10);
if (execute urand(1,100)<=60) {
execute ostatByName(w_id,d_id,execute genName(execute nurand(255,0,999)));
} else {
execute ostatById(w_id,d_id,execute nurand(1023,1,3000));
}
};
create function void deliveryRandom(timestamp now,integer w_id)
{
var integer carrier_id=execute urand(1,10);
execute delivery(w_id,carrier_id,now);
};
create function void slevRandom(integer w_id)
{
var integer d_id=execute urand(1,10);
var integer threshold=execute urand(10,20);
execute slev(w_id,d_id,threshold);
};
create procedure integer partitionedOltp(timestamp now,integer w_id)
{
var integer choice=execute urand(1,1000);
-- Payment?
if (choice<=430) {
execute paymentRandom(now,w_id);
return 1;
}
choice=choice-430;
-- Order status?
if (choice<=40) {
execute ostatRandom(w_id);
return 2;
}
choice=choice-40;
-- Delivery?
if (choice<=45) {
execute deliveryRandom(now,w_id);
return 3;
}
choice=choice-45;
-- Stock level?
if (choice<=40) {
execute slevRandom(w_id);
return 40;
}
-- Default to new order
execute newOrderRandom(now,w_id);
return 0;
};
create procedure integer oltp(timestamp now)
{
return execute partitionedOltp(now,execute urand(1,warehouses));
};
*/
\ No newline at end of file
#ifndef _OLTP_H_
#define _OLTP_H_
#include <ctime>
void newOrderRandom(time_t now, int w_id);
#endif //_OLTP_H_
\ No newline at end of file
create constant integer warehouses = 5;
create function varchar(20) genName(integer id)
{
var array(10) varchar(5) parts = {'BAR','OUGHT','ABLE','PRI','PRES','ESE','ANTI','CALLY','ATION','EING'};
return parts[(id/100)%10]+parts[(id/10)%10]+parts[id%10];
};
create function numeric(6,2) randomnumeric62(numeric(6,2) min,numeric(6,2) max)
{
return min+((cast (random%cast ((max-min)*100) as integer) as numeric(6,2))/100);
};
create function integer nurand(integer A,integer x,integer y)
{
return ((((random%A)|(random%(y-x+1)+x))+42)%(y-x+1))+x;
};
create function integer urand(integer min,integer max)
{
return (random%(max-min+1))+min;
};
create function integer urandexcept(integer min,integer max,integer v)
{
if (max<=min)
return min;
var integer r=(random%(max-min))+min;
if (r>=v)
return r+1; else
return r;
};
create function void newOrderRandom(timestamp now,integer w_id)
{
var integer d_id=execute urand(1,10);
var integer c_id=execute nurand(1023,1,3000);
var integer ol_cnt=execute urand(5,15);
var array(15) integer supware;
var array(15) integer itemid;
var array(15) integer qty;
forsequence (index between 0 and ol_cnt-1) {
if (execute urand(1,100)>1)
supware[index]=w_id; else
supware[index]=execute urandexcept(1,warehouses,w_id);
itemid[index]=execute nurand(8191,1,100000);
qty[index]=execute urand(1,10);
}
forsequence (index between ol_cnt and 14) {
supware[index]=w_id;
}
execute newOrder(w_id,d_id,c_id,ol_cnt,supware,itemid,qty,now);
};
create function void paymentRandom(timestamp now,integer w_id)
{
var integer d_id=execute urand(1,10);
var integer c_w_id;
var integer c_d_id;
if (execute urand(1,100)<=85) {
c_w_id=w_id;
c_d_id=d_id;
} else {
c_w_id=execute urandexcept(1,warehouses,w_id);
c_d_id=execute urand(1,10);
}
var numeric(6,2) h_amount=execute randomnumeric62(1.00,5000.00);
var timestamp h_date=now;
if (execute urand(1,100)<=60) {
execute paymentByName(w_id,d_id,c_w_id,c_d_id,execute genName(execute nurand(255,0,999)),h_date,h_amount,now);
} else {
execute paymentById(w_id,d_id,c_w_id,c_d_id,execute nurand(1023,1,3000),h_date,h_amount,now);
}
};
create function void ostatRandom(integer w_id)
{
var integer d_id=execute urand(1,10);
if (execute urand(1,100)<=60) {
execute ostatByName(w_id,d_id,execute genName(execute nurand(255,0,999)));
} else {
execute ostatById(w_id,d_id,execute nurand(1023,1,3000));
}
};
create function void deliveryRandom(timestamp now,integer w_id)
{
var integer carrier_id=execute urand(1,10);
execute delivery(w_id,carrier_id,now);
};
create function void slevRandom(integer w_id)
{
var integer d_id=execute urand(1,10);
var integer threshold=execute urand(10,20);
execute slev(w_id,d_id,threshold);
};
create procedure integer partitionedOltp(timestamp now,integer w_id)
{
var integer choice=execute urand(1,1000);
-- Payment?
if (choice<=430) {
execute paymentRandom(now,w_id);
return 1;
}
choice=choice-430;
-- Order status?
if (choice<=40) {
execute ostatRandom(w_id);
return 2;
}
choice=choice-40;
-- Delivery?
if (choice<=45) {
execute deliveryRandom(now,w_id);
return 3;
}
choice=choice-45;
-- Stock level?
if (choice<=40) {
execute slevRandom(w_id);
return 40;
}
-- Default to new order
execute newOrderRandom(now,w_id);
return 0;
};
create procedure integer oltp(timestamp now)
{
return execute partitionedOltp(now,execute urand(1,warehouses));
};
#ifndef _SCHEMA_H_
#define _SCHEMA_H_
#include <stdint.h> //Needed for uint64_t
#include <stdio.h> //Needed for FILE
#include <string.h> //Needed for strcpy
#define E_EOF_REACHED -2
class warehouse {
public:
int w_id; // integer not null,
char w_name[10]; // varchar(10) not null,
char w_street_1[20]; // varchar(20) not null,
char w_street_2[20]; // varchar(20) not null,
char w_city[20]; // varchar(20) not null,
char w_state[2]; // varchar(2) not null,
char w_zip[9]; // varchar(9) not null,
uint64_t w_tax;
uint64_t w_ytd;
int parse(FILE **fp);
};
class district {
public:
int d_id;
int d_w_id;
char d_name[10];
char d_street_1[20];
char d_street_2[20];
char d_city[20];
char d_state[2];
char d_zip[9];
uint64_t d_tax;
uint64_t d_ytd;
int d_next_o_id;
//primary key (d_w_id,d_id)
int parse(FILE **fp);
};
class customer {
public:
int c_id;
int c_d_id;
int c_w_id;
char c_first[16];
char c_middle[2];
char c_last[16];
char c_street_1[20];
char c_street_2[20];
char c_city[20];
char c_state[2];
char c_zip[9];
char c_phone[16];
uint64_t c_since;
char c_credit[2];
uint64_t c_credit_lim;
uint64_t c_discount;
uint64_t c_balance;
uint64_t c_ytd_paymenr;
uint64_t c_payment_cnt;
uint64_t c_delivery_cnt;
char c_data[500];
//primary key (c_w_id,c_d_id,c_id)
int parse(FILE **fp);
};
//create index customer_wdl on customer(c_w_id,c_d_id,c_last,c_first);
class history {
public:
int h_c_id;
int h_c_d_id;
int h_c_w_id;
int h_d_id;
int h_w_id;
uint64_t h_date;
uint64_t h_amount;
char h_data[24];
int parse(FILE **fp);
};
class neworder {
public:
int no_o_id;
int no_d_id;
int no_w_id;
//primary key (no_w_id,no_d_id,no_o_id)
neworder();
neworder(int _no_o_id, int _no_d_id, int _no_w_id);
int parse(FILE **fp);
};
class order {
public:
int o_id;
int o_d_id;
int o_w_id;
int o_c_id;
uint64_t o_entry_d; //timestamp
int o_carrier_id;
uint64_t o_ol_cnt;
uint64_t o_all_local;
//primary key (o_w_id,o_d_id,o_id)
order();
order(int _o_id, int _o_d_id, int _o_w_id, int _o_c_id, uint64_t _o_entry_d, int _o_carried_id, uint64_t _o_ol_cnt, uint64_t _o_all_local);
int parse(FILE **fp);
};
//create index order_wdc on "order"(o_w_id,o_d_id,o_c_id,o_id);
class orderline {
public:
int ol_o_id;
int ol_d_id;
int ol_w_id;
int ol_number;
int ol_i_id;
int ol_supply_w_id;
uint64_t ol_delivery_d;
uint64_t ol_quantity;
uint64_t ol_amount;
char ol_dist_info[24];
//primary key (ol_w_id,ol_d_id,ol_o_id,ol_number)
orderline();
orderline(int _ol_o_id, int _ol_d_id, int _ol_w_id, int _ol_number, int _ol_i_id, int _ol_supply_w_id, uint64_t _ol_delivery_d, uint64_t _ol_quantity, uint64_t _ol_amount, char _ol_dist_info[24]);
int parse(FILE **fp);
};
class item {
public:
int i_id; // integer not null,
int i_im_id; // integer not null,
char i_name[24]; // varchar(24) not null,
uint64_t i_price;
char i_data[50];
// primary key (i_id)
int parse(FILE **fp);
};
class stock {
public:
int s_i_id; // integer not null,
int s_w_id; // integer not null,
uint64_t s_quantity; // numeric(4,0) not null,
char s_dist_01[24]; // char(24) not null,
char s_dist_02[24]; // char(24) not null,
char s_dist_03[24]; // char(24) not null,
char s_dist_04[24]; // char(24) not null,
char s_dist_05[24]; // char(24) not null,
char s_dist_06[24]; // char(24) not null,
char s_dist_07[24]; // char(24) not null,
char s_dist_08[24]; // char(24) not null,
char s_dist_09[24]; // char(24) not null,
char s_dist_10[24]; // char(24) not null,
uint64_t s_ytd; // numeric(8,0) not null,
uint64_t s_order_cnt; // numeric(4,0) not null,
uint64_t s_remote_cnt; // numeric(4,0) not null,
char s_data[50]; // varchar(50) not null,
// primary key (s_w_id,s_i_id)
int parse(FILE **fp);
};
#endif //_SCHEMA_H_
\ No newline at end of file
create table warehouse (
w_id integer not null,
w_name varchar(10) not null,
w_street_1 varchar(20) not null,
w_street_2 varchar(20) not null,
w_city varchar(20) not null,
w_state char(2) not null,
w_zip char(9) not null,
w_tax numeric(4,4) not null,
w_ytd numeric(12,2) not null,
primary key (w_id)
);
create table district (
d_id integer not null,
d_w_id integer not null,
d_name varchar(10) not null,
d_street_1 varchar(20) not null,
d_street_2 varchar(20) not null,
d_city varchar(20) not null,
d_state char(2) not null,
d_zip char(9) not null,
d_tax numeric(4,4) not null,
d_ytd numeric(12,2) not null,
d_next_o_id integer not null,
primary key (d_w_id,d_id)
);
create table customer (
c_id integer not null,
c_d_id integer not null,
c_w_id integer not null,
c_first varchar(16) not null,
c_middle char(2) not null,
c_last varchar(16) not null,
c_street_1 varchar(20) not null,
c_street_2 varchar(20) not null,
c_city varchar(20) not null,
c_state char(2) not null,
c_zip char(9) not null,
c_phone char(16) not null,
c_since timestamp not null,
c_credit char(2) not null,
c_credit_lim numeric(12,2) not null,
c_discount numeric(4,4) not null,
c_balance numeric(12,2) not null,
c_ytd_paymenr numeric(12,2) not null,
c_payment_cnt numeric(4,0) not null,
c_delivery_cnt numeric(4,0) not null,
c_data varchar(500) not null,
primary key (c_w_id,c_d_id,c_id)
);
create index customer_wdl on customer(c_w_id,c_d_id,c_last,c_first);
create table history (
h_c_id integer not null,
h_c_d_id integer not null,
h_c_w_id integer not null,
h_d_id integer not null,
h_w_id integer not null,
h_date timestamp not null,
h_amount numeric(6,2) not null,
h_data varchar(24) not null
);
create table neworder (
no_o_id integer not null,
no_d_id integer not null,
no_w_id integer not null,
primary key (no_w_id,no_d_id,no_o_id)
);
create table "order" (
o_id integer not null,
o_d_id integer not null,
o_w_id integer not null,
o_c_id integer not null,
o_entry_d timestamp not null,
o_carrier_id integer not null,
o_ol_cnt numeric(2,0) not null,
o_all_local numeric(1,0) not null,
primary key (o_w_id,o_d_id,o_id)
);
create index order_wdc on "order"(o_w_id,o_d_id,o_c_id,o_id);
create table orderline (
ol_o_id integer not null,
ol_d_id integer not null,
ol_w_id integer not null,
ol_number integer not null,
ol_i_id integer not null,
ol_supply_w_id integer not null,
ol_delivery_d timestamp not null,
ol_quantity numeric(2,0) not null,
ol_amount numeric(6,2) not null,
ol_dist_info char(24) not null,
primary key (ol_w_id,ol_d_id,ol_o_id,ol_number)
);
create table item (
i_id integer not null,
i_im_id integer not null,
i_name varchar(24) not null,
i_price numeric(5,2) not null,
i_data varchar(50) not null,
primary key (i_id)
);
create table stock (
s_i_id integer not null,
s_w_id integer not null,
s_quantity numeric(4,0) not null,
s_dist_01 char(24) not null,
s_dist_02 char(24) not null,
s_dist_03 char(24) not null,
s_dist_04 char(24) not null,
s_dist_05 char(24) not null,
s_dist_06 char(24) not null,
s_dist_07 char(24) not null,
s_dist_08 char(24) not null,
s_dist_09 char(24) not null,
s_dist_10 char(24) not null,
s_ytd numeric(8,0) not null,
s_order_cnt numeric(4,0) not null,
s_remote_cnt numeric(4,0) not null,
s_data varchar(50) not null,
primary key (s_w_id,s_i_id)
);
#include "schema.h"
orderline::orderline() {}
orderline::orderline(int _ol_o_id, int _ol_d_id, int _ol_w_id, int _ol_number, int _ol_i_id, int _ol_supply_w_id, uint64_t _ol_delivery_d, uint64_t _ol_quantity, uint64_t _ol_amount, char _ol_dist_info[24]) {
ol_o_id=_ol_o_id;
ol_d_id=_ol_d_id;
ol_w_id=_ol_w_id;
ol_number=_ol_number;
ol_i_id=_ol_i_id;
ol_supply_w_id=_ol_supply_w_id;
ol_delivery_d=_ol_delivery_d;
ol_quantity=_ol_quantity;
ol_amount=_ol_amount;
strcpy(_ol_dist_info, ol_dist_info);
}
order::order() {}
order::order(int _o_id, int _o_d_id, int _o_w_id, int _o_c_id, uint64_t _o_entry_d, int _o_carried_id, uint64_t _o_ol_cnt, uint64_t _o_all_local) {
o_id=_o_id;
o_d_id=_o_d_id;
o_w_id=_o_w_id;
o_c_id=_o_c_id;
o_entry_d=_o_entry_d;
o_carrier_id=_o_carried_id;
o_ol_cnt=_o_ol_cnt;
o_all_local=_o_all_local;
}
neworder::neworder() {}
neworder::neworder(int _no_o_id, int _no_d_id, int _no_w_id) {
no_o_id=_no_o_id;
no_d_id=_no_d_id;
no_w_id=_no_w_id;
}
\ No newline at end of file
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "schema.h"
int warehouse::parse(FILE **fp) {
char token[25];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: w_id = atoi(token);
break;
case 2: strcpy(token, w_name);
break;
case 3: strcpy(token, w_street_1);
break;
case 4: strcpy(token, w_street_2);
break;
case 5: strcpy(token, w_city);
break;
case 6: strcpy(token, w_state);
break;
case 7: strcpy(token, w_zip);
break;
case 8: w_tax = (uint64_t) atof(token);
break;
case 9: w_ytd = (uint64_t) atof(token);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==9)
break;
else
j++;
}
else
i++;
}
//printf("Loaded warehouse\n");
return 0;
}
int district::parse(FILE **fp) {
char token[25];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: d_id = atoi(token);
break;
case 2: d_w_id = atoi(token);
break;
case 3: strcpy(token, d_name);
break;
case 4: strcpy(token, d_street_1);
break;
case 5: strcpy(token, d_street_2);
break;
case 6: strcpy(token, d_city);
break;
case 7: strcpy(token, d_state);
break;
case 8: strcpy(token, d_zip);
break;
case 9: d_tax = (uint64_t) atof(token);
break;
case 10: d_ytd = (uint64_t) atof(token);
break;
case 11: d_next_o_id = atoi(token);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==11)
break;
else
j++;
}
else
i++;
}
//printf("Loaded district\n");
return 0;
}
int customer::parse(FILE **fp) {
char token[501];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: c_id = atoi(token);
break;
case 2: c_d_id = atoi(token);
break;
case 3: c_w_id = atoi(token);
break;
case 4: strcpy(token, c_first);
break;
case 5: strcpy(token, c_middle);
break;
case 6: strcpy(token, c_last);
break;
case 7: strcpy(token, c_street_1);
break;
case 8: strcpy(token, c_street_2);
break;
case 9: strcpy(token, c_city);
break;
case 10: strcpy(token, c_state);
break;
case 11: strcpy(token, c_zip);
break;
case 12: strcpy(token, c_phone);
break;
case 13: c_since = (uint64_t) atof(token);
break;
case 14: strcpy(token, c_credit);
break;
case 15: c_credit_lim = (uint64_t) atof(token);
break;
case 16: c_discount = (uint64_t) atof(token);
break;
case 17: c_balance = (uint64_t) atof(token);
break;
case 18: c_ytd_paymenr = (uint64_t) atof(token);
break;
case 19: c_payment_cnt = (uint64_t) atof(token);
break;
case 20: c_delivery_cnt = (uint64_t) atof(token);
break;
case 21: strcpy(token, c_data);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==21)
break;
else
j++;
}
else
i++;
}
//printf("Loaded customer\n");
return 0;
}
int history::parse(FILE **fp) {
char token[25];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: h_c_id = atoi(token);
break;
case 2: h_c_d_id = atoi(token);
break;
case 3: h_c_w_id = atoi(token);
break;
case 4: h_d_id = atoi(token);
break;
case 5: h_w_id = atoi(token);
break;
case 6: h_date = (uint64_t) atof(token);
break;
case 7: h_amount = (uint64_t) atof(token);
break;
case 8: strcpy(token, h_data);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==8)
break;
else
j++;
}
else
i++;
}
//printf("Loaded history\n");
return 0;
}
int neworder::parse(FILE **fp) {
char token[10];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: no_o_id = atoi(token);
break;
case 2: no_d_id = atoi(token);
break;
case 3: no_w_id = atoi(token);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==3)
break;
else
j++;
}
else
i++;
}
//printf("Loaded neworder\n");
return 0;
}
int order::parse(FILE **fp) {
char token[25];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: o_id = atoi(token);
break;
case 2: o_d_id = atoi(token);
break;
case 3: o_w_id = atoi(token);
break;
case 4: o_c_id = atoi(token);
break;
case 5: o_entry_d = (uint64_t) atof(token);
break;
case 6: o_carrier_id = atoi(token);
break;
case 7: o_ol_cnt = (uint64_t) atof(token);
break;
case 8: o_all_local = (uint64_t) atof(token);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==8)
break;
else
j++;
}
else
i++;
}
//printf("Loaded order\n");
return 0;
}
int orderline::parse(FILE **fp) {
char token[25];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: ol_o_id = atoi(token);
break;
case 2: ol_d_id = atoi(token);
break;
case 3: ol_w_id = atoi(token);
break;
case 4: ol_number = atoi(token);
break;
case 5: ol_i_id = atoi(token);
break;
case 6: ol_supply_w_id = atoi(token);
break;
case 7: ol_delivery_d = (uint64_t) atof(token);
break;
case 8: ol_quantity = (uint64_t) atof(token);
break;
case 9: ol_amount = (uint64_t) atof(token);
break;
case 10: strcpy(token, ol_dist_info);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==10)
break;
else
j++;
}
else
i++;
}
//printf("Loaded orderline\n");
return 0;
}
int item::parse(FILE **fp) {
char token[51];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: i_id = atoi(token);
break;
case 2: i_im_id = atoi(token);
break;
case 3: strcpy(token, i_name);
break;
case 4: i_price = (uint64_t) atof(token);
break;
case 5: strcpy(token, i_data);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==5)
break;
else
j++;
}
else
i++;
}
//printf("Loaded item\n");
return 0;
}
int stock::parse(FILE **fp) {
char token[51];
int i,j;
i=0;
j=1;
while(1)
{
token[i] = fgetc(*fp);
if(token[i]==EOF)
return E_EOF_REACHED;
//printf("character from file = %c\n",token[i]);
if(token[i]=='|' || token[i]=='\n')
{
token[i] = '\0';
i=0;
//printf("j=%d\n",j);
switch(j)
{
case 1: s_i_id = atoi(token);
break;
case 2: s_w_id = atoi(token);
break;
case 3: s_quantity = (uint64_t) atof(token);
break;
case 4: strcpy(token, s_dist_01);
break;
case 5: strcpy(token, s_dist_02);
break;
case 6: strcpy(token, s_dist_03);
break;
case 7: strcpy(token, s_dist_04);
break;
case 8: strcpy(token, s_dist_05);
break;
case 9: strcpy(token, s_dist_06);
break;
case 10: strcpy(token, s_dist_07);
break;
case 11: strcpy(token, s_dist_08);
break;
case 12: strcpy(token, s_dist_09);
break;
case 13: strcpy(token, s_dist_10);
break;
case 14: s_ytd = (uint64_t) atof(token);
break;
case 15: s_order_cnt = (uint64_t) atof(token);
break;
case 16: s_remote_cnt = (uint64_t) atof(token);
break;
case 17: strcpy(token, s_data);
//printf("all fields filled\n");
break;
default: printf("ERR\n");
}
if(j==17)
break;
else
j++;
}
else
i++;
}
//printf("Loaded stock\n");
return 0;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment