#!/usr/bin/perl -w

use strict;
use MyBench;
use Getopt::Std;
use Time::HiRes qw(gettimeofday tv_interval);
use DBI;

my %opt;
Getopt::Std::getopt('n:r:h:d:f:', \%opt);

my $num_kids  = $opt{n} || 10;
my $num_runs  = $opt{r} || 200;
my $sql_file  = $opt{f} || "sqls.dat";
my $db        = $opt{d} || "gs_de";
my $user      = "root";
my $pass      = "";
my $port      = 3306;
my $host      = $opt{h} || "localhost";
my $dsn       = "DBI:mysql:mysql_server_prepare=1;database=$db:host=$host;port=$port";
my $run_id    = 0;

sub execSQL {

  my $dbh;
  my $sql = "";
  my @params = ();
  
  ($dbh, $sql, @params) = @_;

  $dbh->{RaiseError} = 1;
  my $sth = $dbh->prepare($sql);

  print "";

  eval {
      $sth->execute(@params);
  };
  if ($@){ print "FAILED";} else {print "OK";}
  print "\n";

  $sth->finish();
}

my $callback = sub
{
    my $id  = shift;
    my $cnt = 0;

    my @times = ();
    my @insert_times = ();

    ## wait for the parent to HUP me
    local $SIG{HUP} = sub { };
    sleep 600;

    $run_id = $id;

    my $dbh = DBI->connect($dsn, $user, $pass, { RaiseError => 0 });

    while ($cnt < $num_runs)
    {
      	## time the query
        my $t0 = [gettimeofday];

        
        execSQL($dbh, "INSERT INTO xf_sessions (
                session_id,
                session_expires,
                session_data)
                VALUES(
                '2fqdllua7qmhjqq8jrsgetlqb4',
                '1160584451', '') ON DUPLICATE KEY UPDATE session_expires = '1160584451', session_data = '' ");


        my $t1 = tv_interval($t0, [gettimeofday]);
        push @times, $t1;

        $cnt++;
    }

    $dbh->disconnect();

    ## cleanup
    my @r = ($id, scalar(@times), min(@times), max(@times), avg(@times), tot(@times));
    
    return @r;
};

print "Database    : " . $db . "\n";
print "Clients     : " . $num_kids . "\n";
print "Runs        : " . $num_runs . "\n";

my @results = MyBench::fork_and_work($num_kids, $callback);
MyBench::compute_results('test', @results);

exit;

__END__


