Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/local/bin/tclsh8.6
- if [catch {package require mysqltcl} ] { error "Failed to load mysqltcl - MySQL Library Error" }
- global mysqlstatus
- #EDITABLE OPTIONS##################################################
- set total_iterations 1000000 ;# Number of transactions before logging off
- set RAISEERROR "false" ;# Exit script on MySQL error (true or false)
- set KEYANDTHINK "false" ;# Time for user thinking and keying (true or false)
- set host "127.0.0.1" ;# Address of the server hosting MySQL
- set port "3306" ;# Port of the MySQL Server, defaults to 3306
- set user "alfredu" ;# MySQL user
- set password "pedocaca" ;# Password for the MySQL user
- set db "tpcc" ;# Database containing the TPC Schema
- #EDITABLE OPTIONS##################################################
- #RANDOM NUMBER
- proc RandomNumber {m M} {return [expr {int($m+rand()*($M+1-$m))}]}
- #NURand function
- proc NURand { iConst x y C } {return [ expr {((([RandomNumber 0 $iConst] | [RandomNumber $x $y]) + $C) % ($y - $x + 1)) + $x }]}
- #RANDOM NAME
- proc randname { num } {
- array set namearr { 0 BAR 1 OUGHT 2 ABLE 3 PRI 4 PRES 5 ESE 6 ANTI 7 CALLY 8 ATION 9 EING }
- set name [ concat $namearr([ expr {( $num / 100 ) % 10 }])$namearr([ expr {( $num / 10 ) % 10 }])$namearr([ expr {( $num / 1 ) % 10 }]) ]
- return $name
- }
- #TIMESTAMP
- proc gettimestamp { } {
- set tstamp [ clock format [ clock seconds ] -format %Y%m%d%H%M%S ]
- return $tstamp
- }
- #KEYING TIME
- proc keytime { keying } {
- after [ expr {$keying * 1000} ]
- return
- }
- #THINK TIME
- proc thinktime { thinking } {
- set thinkingtime [ expr {abs(round(log(rand()) * $thinking))} ]
- after [ expr {$thinkingtime * 1000} ]
- return
- }
- #NEW ORDER
- proc neword { mysql_handler no_w_id w_id_input RAISEERROR } {
- global mysqlstatus
- #open new order cursor
- #2.4.1.2 select district id randomly from home warehouse where d_w_id = d_id
- set no_d_id [ RandomNumber 1 10 ]
- #2.4.1.2 Customer id randomly selected where c_d_id = d_id and c_w_id = w_id
- set no_c_id [ RandomNumber 1 3000 ]
- #2.4.1.3 Items in the order randomly selected from 5 to 15
- set ol_cnt [ RandomNumber 5 15 ]
- #2.4.1.6 order entry date O_ENTRY_D generated by SUT
- set date [ gettimestamp ]
- mysqlexec $mysql_handler "set @next_o_id = 0"
- catch { mysqlexec $mysql_handler "CALL NEWORD($no_w_id,$w_id_input,$no_d_id,$no_c_id,$ol_cnt,@disc,@last,@credit,@dtax,@wtax,@next_o_id,$date)" }
- if { $mysqlstatus(code) } {
- if { $RAISEERROR } {
- error "New Order : $mysqlstatus(message)"
- } else { puts $mysqlstatus(message)
- }
- } else {
- puts [ join [ mysql::sel $mysql_handler "select @disc,@last,@credit,@dtax,@wtax,@next_o_id" -list ] ]
- }
- }
- #PAYMENT
- proc payment { mysql_handler p_w_id w_id_input RAISEERROR } {
- global mysqlstatus
- #2.5.1.1 The home warehouse id remains the same for each terminal
- #2.5.1.1 select district id randomly from home warehouse where d_w_id = d_id
- set p_d_id [ RandomNumber 1 10 ]
- #2.5.1.2 customer selected 60% of time by name and 40% of time by number
- set x [ RandomNumber 1 100 ]
- set y [ RandomNumber 1 100 ]
- if { $x <= 85 } {
- set p_c_d_id $p_d_id
- set p_c_w_id $p_w_id
- } else {
- #use a remote warehouse
- set p_c_d_id [ RandomNumber 1 10 ]
- set p_c_w_id [ RandomNumber 1 $w_id_input ]
- while { ($p_c_w_id == $p_w_id) && ($w_id_input != 1) } {
- set p_c_w_id [ RandomNumber 1 $w_id_input ]
- }
- }
- set nrnd [ NURand 255 0 999 123 ]
- set name [ randname $nrnd ]
- set p_c_id [ RandomNumber 1 3000 ]
- if { $y <= 60 } {
- #use customer name
- #C_LAST is generated
- set byname 1
- } else {
- #use customer number
- set byname 0
- set name {}
- }
- #2.5.1.3 random amount from 1 to 5000
- set p_h_amount [ RandomNumber 1 5000 ]
- #2.5.1.4 date selected from SUT
- set h_date [ gettimestamp ]
- #2.5.2.1 Payment Transaction
- mysqlexec $mysql_handler "set @p_c_id = $p_c_id, @p_c_last = '$name', @p_c_credit = 0, @p_c_balance = 0"
- catch { mysqlexec $mysql_handler "CALL PAYMENT($p_w_id,$p_d_id,$p_c_w_id,$p_c_d_id,@p_c_id,$byname,$p_h_amount,@p_c_last,@p_w_street_1,@p_w_street_2,@p_w_city,@p_w_state,@p_w_zip,@p_d_street_1,@p_d_street_2,@p_d_city,@p_d_state,@p_d_zip,@p_c_first,@p_c_middle,@p_c_street_1,@p_c_street_2,@p_c_city,@p_c_state,@p_c_zip,@p_c_phone,@p_c_since,@p_c_credit,@p_c_credit_lim,@p_c_discount,@p_c_balance,@p_c_data,$h_date)"}
- if { $mysqlstatus(code) } {
- if { $RAISEERROR } {
- error "Payment : $mysqlstatus(message)"
- } else { puts $mysqlstatus(message)
- }
- } else {
- puts [ join [ mysql::sel $mysql_handler "select @p_c_id,@p_c_last,@p_w_street_1,@p_w_street_2,@p_w_city,@p_w_state,@p_w_zip,@p_d_street_1,@p_d_street_2,@p_d_city,@p_d_state,@p_d_zip,@p_c_first,@p_c_middle,@p_c_street_1,@p_c_street_2,@p_c_city,@p_c_state,@p_c_zip,@p_c_phone,@p_c_since,@p_c_credit,@p_c_credit_lim,@p_c_discount,@p_c_balance,@p_c_data" -list ] ]
- }
- }
- #ORDER_STATUS
- proc ostat { mysql_handler w_id RAISEERROR } {
- global mysqlstatus
- #2.5.1.1 select district id randomly from home warehouse where d_w_id = d_id
- set d_id [ RandomNumber 1 10 ]
- set nrnd [ NURand 255 0 999 123 ]
- set name [ randname $nrnd ]
- set c_id [ RandomNumber 1 3000 ]
- set y [ RandomNumber 1 100 ]
- if { $y <= 60 } {
- set byname 1
- } else {
- set byname 0
- set name {}
- }
- mysqlexec $mysql_handler "set @os_c_id = $c_id, @os_c_last = '$name'"
- catch { mysqlexec $mysql_handler "CALL OSTAT($w_id,$d_id,@os_c_id,$byname,@os_c_last,@os_c_first,@os_c_middle,@os_c_balance,@os_o_id,@os_entdate,@os_o_carrier_id)"}
- if { $mysqlstatus(code) } {
- if { $RAISEERROR } {
- error "Order Status : $mysqlstatus(message)"
- } else { puts $mysqlstatus(message)
- }
- } else {
- puts [ join [ mysql::sel $mysql_handler "select @os_c_id,@os_c_last,@os_c_first,@os_c_middle,@os_c_balance,@os_o_id,@os_entdate,@os_o_carrier_id" -list ] ]
- }
- }
- #DELIVERY
- proc delivery { mysql_handler w_id RAISEERROR } {
- global mysqlstatus
- set carrier_id [ RandomNumber 1 10 ]
- set date [ gettimestamp ]
- catch { mysqlexec $mysql_handler "CALL DELIVERY($w_id,$carrier_id,$date)"}
- if { $mysqlstatus(code) } {
- if { $RAISEERROR } {
- error "Delivery : $mysqlstatus(message)"
- } else { puts $mysqlstatus(message)
- }
- } else {
- puts "$w_id $carrier_id $date"
- }
- }
- #STOCK LEVEL
- proc slev { mysql_handler w_id stock_level_d_id RAISEERROR } {
- global mysqlstatus
- set threshold [ RandomNumber 10 20 ]
- mysqlexec $mysql_handler "CALL SLEV($w_id,$stock_level_d_id,$threshold)"
- if { $mysqlstatus(code) } {
- if { $RAISEERROR } {
- error "Stock Level : $mysqlstatus(message)"
- } else { puts $mysqlstatus(message)
- }
- } else {
- puts "$w_id $stock_level_d_id $threshold"
- }
- }
- #RUN TPC-C
- if [catch {mysqlconnect -host $host -port $port -user $user -password $password} mysql_handler] {
- puts "the database connection to $host could not be established"
- error $mysqlstatus(message)
- } else {
- mysqluse $mysql_handler $db
- mysql::autocommit $mysql_handler 0
- }
- set w_id_input [ list [ mysql::sel $mysql_handler "select max(w_id) from warehouse" -list ] ]
- #2.4.1.1 set warehouse_id stays constant for a given terminal
- set w_id [ RandomNumber 1 $w_id_input ]
- set d_id_input [ list [ mysql::sel $mysql_handler "select max(d_id) from district" -list ] ]
- set stock_level_d_id [ RandomNumber 1 $d_id_input ]
- puts "Processing $total_iterations transactions without output suppressed..."
- set abchk 1; set abchk_mx 1024; set hi_t [ expr {pow([ lindex [ time {if { [ tsv::get application abort ] } { break }} ] 0 ],2)}]
- for {set it 0} {$it < $total_iterations} {incr it} {
- if { [expr {$it % $abchk}] eq 0 } { if { [ time {if { [ tsv::get application abort ] } { break }} ] > $hi_t } { set abchk [ expr {min(($abchk * 2), $abchk_mx)}]; set hi_t [ expr {$hi_t * 2} ] } }
- set choice [ RandomNumber 1 23 ]
- if {$choice <= 10} {
- puts "new order"
- if { $KEYANDTHINK } { keytime 18 }
- neword $mysql_handler $w_id $w_id_input $RAISEERROR
- if { $KEYANDTHINK } { thinktime 12 }
- } elseif {$choice <= 20} {
- puts "payment"
- if { $KEYANDTHINK } { keytime 3 }
- payment $mysql_handler $w_id $w_id_input $RAISEERROR
- if { $KEYANDTHINK } { thinktime 12 }
- } elseif {$choice <= 21} {
- puts "delivery"
- if { $KEYANDTHINK } { keytime 2 }
- delivery $mysql_handler $w_id $RAISEERROR
- if { $KEYANDTHINK } { thinktime 10 }
- } elseif {$choice <= 22} {
- puts "stock level"
- if { $KEYANDTHINK } { keytime 2 }
- slev $mysql_handler $w_id $stock_level_d_id $RAISEERROR
- if { $KEYANDTHINK } { thinktime 5 }
- } elseif {$choice <= 23} {
- puts "order status"
- if { $KEYANDTHINK } { keytime 2 }
- ostat $mysql_handler $w_id $RAISEERROR
- if { $KEYANDTHINK } { thinktime 5 }
- }
- }
- mysqlclose $mysql_handler
- POSTGRES:
- !/usr/local/bin/tclsh8.6
- if [catch {package require Pgtcl} ] { error "Failed to load Pgtcl - Postgres Library Error" }
- #EDITABLE OPTIONS##################################################
- set total_iterations 1000000 ;# Number of transactions before logging off
- set RAISEERROR "false" ;# Exit script on PostgreSQL (true or false)
- set KEYANDTHINK "false" ;# Time for user thinking and keying (true or false)
- set ora_compatible "false" ;#Postgres Plus Oracle Compatible Schema
- set host "localhost" ;# Address of the server hosting PostgreSQL
- set port "5432" ;# Port of the PostgreSQL Server
- set user "tpcc" ;# PostgreSQL user
- set password "tpcc" ;# Password for the PostgreSQL user
- set db "tpcc" ;# Database containing the TPC Schema
- #EDITABLE OPTIONS##################################################
- #RANDOM NUMBER
- proc RandomNumber {m M} {return [expr {int($m+rand()*($M+1-$m))}]}
- #NURand function
- proc NURand { iConst x y C } {return [ expr {((([RandomNumber 0 $iConst] | [RandomNumber $x $y]) + $C) % ($y - $x + 1)) + $x }]}
- #RANDOM NAME
- proc randname { num } {
- array set namearr { 0 BAR 1 OUGHT 2 ABLE 3 PRI 4 PRES 5 ESE 6 ANTI 7 CALLY 8 ATION 9 EING }
- set name [ concat $namearr([ expr {( $num / 100 ) % 10 }])$namearr([ expr {( $num / 10 ) % 10 }])$namearr([ expr {( $num / 1 ) % 10 }]) ]
- return $name
- }
- #TIMESTAMP
- proc gettimestamp { } {
- set tstamp [ clock format [ clock seconds ] -format %Y%m%d%H%M%S ]
- return $tstamp
- }
- #KEYING TIME
- proc keytime { keying } {
- after [ expr {$keying * 1000} ]
- return
- }
- #THINK TIME
- proc thinktime { thinking } {
- set thinkingtime [ expr {abs(round(log(rand()) * $thinking))} ]
- after [ expr {$thinkingtime * 1000} ]
- return
- }
- #POSTGRES CONNECTION
- proc ConnectToPostgres { host port user password dbname } {
- global tcl_platform
- if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]} message]} {
- set lda "Failed" ; puts $message
- error $message
- } else {
- if {$tcl_platform(platform) == "windows"} {
- #Workaround for Bug #95 where first connection fails on Windows
- catch {pg_disconnect $lda}
- set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]
- }
- pg_notice_handler $lda puts
- set result [ pg_exec $lda "set CLIENT_MIN_MESSAGES TO 'ERROR'" ]
- pg_result $result -clear
- }
- return $lda
- }
- #NEW ORDER
- proc neword { lda no_w_id w_id_input RAISEERROR ora_compatible } {
- #2.4.1.2 select district id randomly from home warehouse where d_w_id = d_id
- set no_d_id [ RandomNumber 1 10 ]
- #2.4.1.2 Customer id randomly selected where c_d_id = d_id and c_w_id = w_id
- set no_c_id [ RandomNumber 1 3000 ]
- #2.4.1.3 Items in the order randomly selected from 5 to 15
- set ol_cnt [ RandomNumber 5 15 ]
- #2.4.1.6 order entry date O_ENTRY_D generated by SUT
- set date [ gettimestamp ]
- if { $ora_compatible eq "true" } {
- set result [pg_exec $lda "exec neword($no_w_id,$w_id_input,$no_d_id,$no_c_id,$ol_cnt,0,TO_TIMESTAMP($date,'YYYYMMDDHH24MISS'))" ]
- } else {
- set result [pg_exec $lda "select neword($no_w_id,$w_id_input,$no_d_id,$no_c_id,$ol_cnt,0)" ]
- }
- if {[pg_result $result -status] != "PGRES_TUPLES_OK"} {
- if { $RAISEERROR } {
- error "[pg_result $result -error]"
- } else {
- puts "New Order Procedure Error set RAISEERROR for Details"
- }
- } else {
- puts "New Order: $no_w_id $w_id_input $no_d_id $no_c_id $ol_cnt 0 [ pg_result $result -list ]"
- pg_result $result -clear
- }
- }
- #PAYMENT
- proc payment { lda p_w_id w_id_input RAISEERROR ora_compatible } {
- #2.5.1.1 The home warehouse id remains the same for each terminal
- #2.5.1.1 select district id randomly from home warehouse where d_w_id = d_id
- set p_d_id [ RandomNumber 1 10 ]
- #2.5.1.2 customer selected 60% of time by name and 40% of time by number
- set x [ RandomNumber 1 100 ]
- set y [ RandomNumber 1 100 ]
- if { $x <= 85 } {
- set p_c_d_id $p_d_id
- set p_c_w_id $p_w_id
- } else {
- #use a remote warehouse
- set p_c_d_id [ RandomNumber 1 10 ]
- set p_c_w_id [ RandomNumber 1 $w_id_input ]
- while { ($p_c_w_id == $p_w_id) && ($w_id_input != 1) } {
- set p_c_w_id [ RandomNumber 1 $w_id_input ]
- }
- }
- set nrnd [ NURand 255 0 999 123 ]
- set name [ randname $nrnd ]
- set p_c_id [ RandomNumber 1 3000 ]
- if { $y <= 60 } {
- #use customer name
- #C_LAST is generated
- set byname 1
- } else {
- #use customer number
- set byname 0
- set name {}
- }
- #2.5.1.3 random amount from 1 to 5000
- set p_h_amount [ RandomNumber 1 5000 ]
- #2.5.1.4 date selected from SUT
- set h_date [ gettimestamp ]
- #2.5.2.1 Payment Transaction
- #change following to correct values
- if { $ora_compatible eq "true" } {
- set result [pg_exec $lda "exec payment($p_w_id,$p_d_id,$p_c_w_id,$p_c_d_id,$p_c_id,$byname,$p_h_amount,'$name','0',0,TO_TIMESTAMP($h_date,'YYYYMMDDHH24MISS'))" ]
- } else {
- set result [pg_exec $lda "select payment($p_w_id,$p_d_id,$p_c_w_id,$p_c_d_id,$p_c_id,$byname,$p_h_amount,'$name','0',0)" ]
- }
- if {[pg_result $result -status] != "PGRES_TUPLES_OK"} {
- if { $RAISEERROR } {
- error "[pg_result $result -error]"
- } else {
- puts "Payment Procedure Error set RAISEERROR for Details"
- }
- } else {
- puts "Payment: $p_w_id $p_d_id $p_c_w_id $p_c_d_id $p_c_id $byname $p_h_amount $name 0 0 [ pg_result $result -list ]"
- pg_result $result -clear
- }
- }
- #ORDER_STATUS
- proc ostat { lda w_id RAISEERROR ora_compatible } {
- #2.5.1.1 select district id randomly from home warehouse where d_w_id = d_id
- set d_id [ RandomNumber 1 10 ]
- set nrnd [ NURand 255 0 999 123 ]
- set name [ randname $nrnd ]
- set c_id [ RandomNumber 1 3000 ]
- set y [ RandomNumber 1 100 ]
- if { $y <= 60 } {
- set byname 1
- } else {
- set byname 0
- set name {}
- }
- if { $ora_compatible eq "true" } {
- set result [pg_exec $lda "exec ostat($w_id,$d_id,$c_id,$byname,'$name')" ]
- } else {
- set result [pg_exec $lda "select * from ostat($w_id,$d_id,$c_id,$byname,'$name') as (ol_i_id NUMERIC, ol_supply_w_id NUMERIC, ol_quantity NUMERIC, ol_amount NUMERIC, ol_delivery_d TIMESTAMP, out_os_c_id INTEGER, out_os_c_last VARCHAR, os_c_first VARCHAR, os_c_middle VARCHAR, os_c_balance NUMERIC, os_o_id INTEGER, os_entdate TIMESTAMP, os_o_carrier_id INTEGER)" ]
- }
- if {[pg_result $result -status] != "PGRES_TUPLES_OK"} {
- if { $RAISEERROR } {
- error "[pg_result $result -error]"
- } else {
- puts "Order Status Procedure Error set RAISEERROR for Details"
- }
- } else {
- puts "Order Status: $w_id $d_id $c_id $byname $name [ pg_result $result -list ]"
- pg_result $result -clear
- }
- }
- #DELIVERY
- proc delivery { lda w_id RAISEERROR ora_compatible } {
- set carrier_id [ RandomNumber 1 10 ]
- set date [ gettimestamp ]
- if { $ora_compatible eq "true" } {
- set result [pg_exec $lda "exec delivery($w_id,$carrier_id,TO_TIMESTAMP($date,'YYYYMMDDHH24MISS'))" ]
- } else {
- set result [pg_exec $lda "select delivery($w_id,$carrier_id)" ]
- }
- if {[pg_result $result -status] ni {"PGRES_TUPLES_OK" "PGRES_COMMAND_OK"}} {
- if { $RAISEERROR } {
- error "[pg_result $result -error]"
- } else {
- puts "Delivery Procedure Error set RAISEERROR for Details"
- }
- } else {
- puts "Delivery: $w_id $carrier_id [ pg_result $result -list ]"
- pg_result $result -clear
- }
- }
- #STOCK LEVEL
- proc slev { lda w_id stock_level_d_id RAISEERROR ora_compatible } {
- set threshold [ RandomNumber 10 20 ]
- if { $ora_compatible eq "true" } {
- set result [pg_exec $lda "exec slev($w_id,$stock_level_d_id,$threshold)" ]
- } else {
- set result [pg_exec $lda "select slev($w_id,$stock_level_d_id,$threshold)" ]
- }
- if {[pg_result $result -status] ni {"PGRES_TUPLES_OK" "PGRES_COMMAND_OK"}} {
- if { $RAISEERROR } {
- error "[pg_result $result -error]"
- } else {
- puts "Stock Level Procedure Error set RAISEERROR for Details"
- }
- } else {
- puts "Stock Level: $w_id $stock_level_d_id $threshold [ pg_result $result -list ]"
- pg_result $result -clear
- }
- }
- #RUN TPC-C
- set lda [ ConnectToPostgres $host $port $user $password $db ]
- if { $lda eq "Failed" } {
- error "error, the database connection to $host could not be established"
- } else {
- if { $ora_compatible eq "true" } {
- set result [ pg_exec $lda "exec dbms_output.disable" ]
- pg_result $result -clear
- }
- }
- pg_select $lda "select max(w_id) from warehouse" w_id_input_arr {
- set w_id_input $w_id_input_arr(max)
- }
- #2.4.1.1 set warehouse_id stays constant for a given terminal
- set w_id [ RandomNumber 1 $w_id_input ]
- pg_select $lda "select max(d_id) from district" d_id_input_arr {
- set d_id_input $d_id_input_arr(max)
- }
- set stock_level_d_id [ RandomNumber 1 $d_id_input ]
- puts "Processing $total_iterations transactions without output suppressed..."
- set abchk 1; set abchk_mx 1024; set hi_t [ expr {pow([ lindex [ time {if { [ tsv::get application abort ] } { break }} ] 0 ],2)}]
- for {set it 0} {$it < $total_iterations} {incr it} {
- if { [expr {$it % $abchk}] eq 0 } { if { [ time {if { [ tsv::get application abort ] } { break }} ] > $hi_t } { set abchk [ expr {min(($abchk * 2), $abchk_mx)}]; set hi_t [ expr {$hi_t * 2} ] } }
- set choice [ RandomNumber 1 23 ]
- if {$choice <= 10} {
- puts "new order"
- if { $KEYANDTHINK } { keytime 18 }
- neword $lda $w_id $w_id_input $RAISEERROR $ora_compatible
- if { $KEYANDTHINK } { thinktime 12 }
- } elseif {$choice <= 20} {
- puts "payment"
- if { $KEYANDTHINK } { keytime 3 }
- payment $lda $w_id $w_id_input $RAISEERROR $ora_compatible
- if { $KEYANDTHINK } { thinktime 12 }
- } elseif {$choice <= 21} {
- puts "delivery"
- if { $KEYANDTHINK } { keytime 2 }
- delivery $lda $w_id $RAISEERROR $ora_compatible
- if { $KEYANDTHINK } { thinktime 10 }
- } elseif {$choice <= 22} {
- puts "stock level"
- if { $KEYANDTHINK } { keytime 2 }
- slev $lda $w_id $stock_level_d_id $RAISEERROR $ora_compatible
- if { $KEYANDTHINK } { thinktime 5 }
- } elseif {$choice <= 23} {
- puts "order status"
- if { $KEYANDTHINK } { keytime 2 }
- ostat $lda $w_id $RAISEERROR $ora_compatible
- if { $KEYANDTHINK } { thinktime 5 }
- }
- }
- pg_disconnect $lda
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement