use strict;
use DBI;
$| = 1;
my $release_root = '/build/6.0.4-p2/';
my $datadir = '/build/starvation_datadir';

my $dbh;

start_server();
$dbh->do("DROP DATABASE IF EXISTS blobtest");
$dbh->do("CREATE DATABASE blobtest");
$dbh->do("CREATE TABLE blobtest.blobtest (id integer not null auto_increment, bl mediumblob, md5 char(32), primary key(id)) ENGINE=Falcon");
$dbh->do("SET autocommit=OFF");
$dbh->do("START TRANSACTION");

my @alphabet= ('A'..'Z');
my $row_count;
while (1) {
	my $blob_size = int(rand(255)) * 1024;
	my $blob_letter = $alphabet[int(rand($#alphabet))];

	my $rand_command = rand();
	if ($rand_command < 0.4) {
		print localtime()." [$$] Insert...\n";
		$dbh->do("
			INSERT INTO blobtest.blobtest
			(bl, md5) VALUES
			(REPEAT('$blob_letter', $blob_size), MD5(REPEAT('$blob_letter', $blob_size)));
		");
		$row_count++;
	} elsif ($rand_command > 0.9) {
		print localtime()." [$$] Delete...\n";
		my $delete_id = int(rand($row_count));
		$dbh->do("
			DELETE FROM blobtest.blobtest
			WHERE id = $delete_id
		");
		$row_count--;
	} else {
		my $update_id = int(rand($row_count));
		print localtime()." [$$] Update...\n";
		$dbh->do("
			UPDATE blobtest.blobtest
			SET bl = REPEAT('$blob_letter', $blob_size),
			md5 = MD5(REPEAT('$blob_letter', $blob_size))
			WHERE id = $update_id
		");
	}
			
	my $trans_rand = rand();
	if ($trans_rand > 0.90) {
		print localtime()." [$$] Commit...\n";
		$dbh->do("COMMIT");
		$dbh->do("START TRANSACTION");
	} elsif ($trans_rand < 0.10) {
		print localtime()." [$$] Rollback...\n";
		$dbh->do("ROLLBACK");
		$dbh->do("START TRANSACTION");
	}
}


print "end!";

sub start_server {
	print localtime()." [$$] Starting server...\n";
	system("$release_root/bin/mysqld --datadir=$datadir --language=$release_root/share/english --skip-grant-tables --skip-innodb --falcon_page_cache_size=200Mb --falcon_record_memory_max=200Mb &");
	sleep 5;
	$dbh = DBI->connect('dbi:mysql:');
}
