mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
	
		
			5.9 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env perl
 | 
						|
 | 
						|
# vim:sw=8:ai:ts=8
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
 | 
						|
use DBI;
 | 
						|
use Net::HandlerSocket;
 | 
						|
 | 
						|
my %conf = ();
 | 
						|
for my $i (@ARGV) {
 | 
						|
	my ($k, $v) = split(/=/, $i);
 | 
						|
	$conf{$k} = $v;
 | 
						|
}
 | 
						|
 | 
						|
my $verbose = get_conf("verbose", 0);
 | 
						|
my $actions_str = get_conf("actions", "hsread");
 | 
						|
my $tablesize = get_conf("tablesize", 10000);
 | 
						|
my $db = get_conf("db", "hstest");
 | 
						|
my $table = get_conf("table", "hstest_table1");
 | 
						|
my $engine = get_conf("engine", "innodb");
 | 
						|
my $host = get_conf("host", "localhost");
 | 
						|
my $mysqlport = get_conf("mysqlport", 3306);
 | 
						|
my $mysqluser = get_conf("mysqluser", "root");
 | 
						|
my $mysqlpass = get_conf("mysqlpass", "");
 | 
						|
my $hsport = get_conf("hsport", 9999);
 | 
						|
my $loop = get_conf("loop", 10000);
 | 
						|
my $op = get_conf("op", "=");
 | 
						|
my $ssps = get_conf("ssps", 0);
 | 
						|
my $num_moreflds = get_conf("moreflds", 0);
 | 
						|
my $moreflds_prefix = get_conf("moreflds_prefix", "column0123456789_");
 | 
						|
my $keytype = get_conf("keytype", "varchar(32)");
 | 
						|
my $file = get_conf("file", undef);
 | 
						|
 | 
						|
my $dsn = "DBI:MariaDB:database=;host=$host;port=$mysqlport"
 | 
						|
	. ";mariadb_server_prepare=$ssps";
 | 
						|
my $dbh = DBI->connect($dsn, $mysqluser, $mysqlpass, { RaiseError => 1 });
 | 
						|
my $hsargs = { 'host' => $host, 'port' => $hsport };
 | 
						|
my $cli = new Net::HandlerSocket($hsargs);
 | 
						|
 | 
						|
my @actions = split(/,/, $actions_str);
 | 
						|
for my $action (@actions) {
 | 
						|
	if ($action eq "table") {
 | 
						|
		print("TABLE $db.$table\n");
 | 
						|
		$dbh->do("drop database if exists $db");
 | 
						|
		$dbh->do("create database $db");
 | 
						|
		$dbh->do("use $db");
 | 
						|
		my $moreflds = get_createtbl_moreflds_str();
 | 
						|
		$dbh->do(
 | 
						|
			"create table $table (" .
 | 
						|
			"k $keytype primary key" .
 | 
						|
			",v varchar(32) not null" .
 | 
						|
			$moreflds .
 | 
						|
			") character set utf8 collate utf8_bin " .
 | 
						|
			"engine = $engine");
 | 
						|
	} elsif ($action eq "insert") {
 | 
						|
		print("INSERT $db.$table tablesize=$tablesize\n");
 | 
						|
		$dbh->do("use $db");
 | 
						|
		my $moreflds = get_insert_moreflds_str();
 | 
						|
		for (my $i = 0; $i < $tablesize; $i += 100) {
 | 
						|
			my $qstr = "insert into $db.$table values";
 | 
						|
			for (my $j = 0; $j < 100; ++$j) {
 | 
						|
				if ($j != 0) {
 | 
						|
					$qstr .= ",";
 | 
						|
				}
 | 
						|
				my $k = "" . ($i + $j);
 | 
						|
				my $v = "v" . int(rand(1000)) . ($i + $j);
 | 
						|
				$qstr .= "('$k', '$v'";
 | 
						|
				for (my $j = 0; $j < $num_moreflds; ++$j) {
 | 
						|
					$qstr .= ",'$j'";
 | 
						|
				}
 | 
						|
				$qstr .= ")";
 | 
						|
			}
 | 
						|
			$dbh->do($qstr);
 | 
						|
			print "$i/$tablesize\n" if $i % 1000 == 0;
 | 
						|
		}
 | 
						|
	} elsif ($action eq "read") {
 | 
						|
		print("READ $db.$table op=$op loop=$loop\n");
 | 
						|
		$dbh->do("use $db");
 | 
						|
		my $moreflds = get_select_moreflds_str();
 | 
						|
		my $sth = $dbh->prepare(
 | 
						|
			"select k,v$moreflds from $db.$table where k = ?");
 | 
						|
		for (my $i = 0; $i < $loop; ++$i) {
 | 
						|
			my $k = "" . int(rand($tablesize));
 | 
						|
			# print "k=$k\n";
 | 
						|
			$sth->execute($k);
 | 
						|
			if ($verbose >= 10) {
 | 
						|
				print "RET:";
 | 
						|
				while (my $ref = $sth->fetchrow_arrayref()) {
 | 
						|
					my $rk = $ref->[0];
 | 
						|
					my $rv = $ref->[1];
 | 
						|
					print " $rk $rv";
 | 
						|
				}
 | 
						|
				print "\n";
 | 
						|
			}
 | 
						|
			print "$i/$loop\n" if $i % 1000 == 0;
 | 
						|
		}
 | 
						|
	} elsif ($action eq "hsinsert") {
 | 
						|
		print("HSINSERT $db.$table tablesize=$tablesize\n");
 | 
						|
		$cli->open_index(1, $db, $table, '', 'k,v');
 | 
						|
		for (my $i = 0; $i < $tablesize; ++$i) {
 | 
						|
			my $k = "" . $i;
 | 
						|
			my $v = "v" . int(rand(1000)) . $i;
 | 
						|
			my $r = $cli->execute_insert(1, [ $k, $v ]);
 | 
						|
			if ($r->[0] != 0) {
 | 
						|
				die;
 | 
						|
			}
 | 
						|
			print "$i/$tablesize\n" if $i % 1000 == 0;
 | 
						|
		}
 | 
						|
	} elsif ($action eq "hsread") {
 | 
						|
		print("HSREAD $db.$table op=$op loop=$loop\n");
 | 
						|
		my $moreflds = get_select_moreflds_str();
 | 
						|
		$cli->open_index(1, $db, $table, '', "k,v$moreflds");
 | 
						|
		for (my $i = 0; $i < $loop; ++$i) {
 | 
						|
			my $k = "" . int(rand($tablesize));
 | 
						|
			# print "k=$k\n";
 | 
						|
			my $r = $cli->execute_find(1, $op, [ $k ], 1, 0);
 | 
						|
			if ($verbose >= 10) {
 | 
						|
				my $len = scalar(@{$r});
 | 
						|
				print "LEN=$len";
 | 
						|
				for my $e (@{$r}) {
 | 
						|
					print " [$e]";
 | 
						|
				}
 | 
						|
				print "\n";
 | 
						|
			}
 | 
						|
			print "$i/$loop\n" if $i % 1000 == 0;
 | 
						|
		}
 | 
						|
	} elsif ($action eq "hsupdate") {
 | 
						|
		my $vbase = "v" . int(rand(1000));
 | 
						|
		print("HSUPDATE $db.$table op=$op loop=$loop vbase=$vbase\n");
 | 
						|
		$cli->open_index(1, $db, $table, '', 'v');
 | 
						|
		for (my $i = 0; $i < $loop; ++$i) {
 | 
						|
			my $k = "" . int(rand($tablesize));
 | 
						|
			my $v = $vbase . $i;
 | 
						|
			print "k=$k v=$v\n";
 | 
						|
			my $r = $cli->execute_update(1, $op, [ $k ], 1, 0,
 | 
						|
				[ $v ]);
 | 
						|
			if ($verbose >= 10) {
 | 
						|
				print "UP k=$k v=$v\n";
 | 
						|
			}
 | 
						|
			print "$i/$loop\n" if $i % 1000 == 0;
 | 
						|
		}
 | 
						|
	} elsif ($action eq "hsdelete") {
 | 
						|
		print("HSDELETE $db.$table op=$op loop=$loop\n");
 | 
						|
		$cli->open_index(1, $db, $table, '', '');
 | 
						|
		for (my $i = 0; $i < $loop; ++$i) {
 | 
						|
			my $k = "" . int(rand($tablesize));
 | 
						|
			print "k=$k\n";
 | 
						|
			my $r = $cli->execute_delete(1, $op, [ $k ], 1, 0);
 | 
						|
			if ($verbose >= 10) {
 | 
						|
				print "DEL k=$k\n";
 | 
						|
			}
 | 
						|
			print "$i/$loop\n" if $i % 1000 == 0;
 | 
						|
		}
 | 
						|
	} elsif ($action eq "verify") {
 | 
						|
		verify_do();
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub verify_do {
 | 
						|
	my ($fail_cnt, $ok_cnt) = (0, 0);
 | 
						|
	my $sth = $dbh->prepare("select v from $db.$table where k = ?");
 | 
						|
	use FileHandle;
 | 
						|
	my $fh = new FileHandle($file, "r");
 | 
						|
	while (my $line = <$fh>) {
 | 
						|
		chomp($line);
 | 
						|
		my @vec = split(/\t/, $line);
 | 
						|
		my $k = $vec[3];
 | 
						|
		my $v = $vec[7];
 | 
						|
		next if (!defined($k) || !defined($v));
 | 
						|
		# print "$k $v\n";
 | 
						|
		$sth->execute($k);
 | 
						|
		my $aref = $sth->fetchrow_arrayref();
 | 
						|
		if (!defined($aref)) {
 | 
						|
			print "FAILED: $k notfound\n";
 | 
						|
			++$fail_cnt;
 | 
						|
		} else {
 | 
						|
			my $gv = $aref->[0];
 | 
						|
			if ($gv ne $v) {
 | 
						|
				print "FAILED: $k got=$gv expected=$v\n";
 | 
						|
				++$fail_cnt;
 | 
						|
			} else {
 | 
						|
				print "OK: $k $v $gv\n" if $verbose >= 10;
 | 
						|
				++$ok_cnt;
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	print "OK=$ok_cnt FAIL=$fail_cnt\n";
 | 
						|
}
 | 
						|
 | 
						|
sub get_conf {
 | 
						|
	my ($key, $def) = @_;
 | 
						|
	my $val = $conf{$key};
 | 
						|
	if ($val) {
 | 
						|
		print "$key=$val\n";
 | 
						|
	} else {
 | 
						|
		$val = $def;
 | 
						|
		$def ||= '';
 | 
						|
		print "$key=$def(default)\n";
 | 
						|
	}
 | 
						|
	return $val;
 | 
						|
}
 | 
						|
 | 
						|
sub get_createtbl_moreflds_str {
 | 
						|
	my $s = "";
 | 
						|
	for (my $j = 0; $j < $num_moreflds; ++$j) {
 | 
						|
		$s .= ",$moreflds_prefix$j varchar(30)";
 | 
						|
	}
 | 
						|
	return $s;
 | 
						|
}
 | 
						|
 | 
						|
sub get_select_moreflds_str {
 | 
						|
	my $s = "";
 | 
						|
	for (my $i = 0; $i < $num_moreflds; ++$i) {
 | 
						|
		$s .= ",$moreflds_prefix$i";
 | 
						|
	}
 | 
						|
	return $s;
 | 
						|
}
 | 
						|
 | 
						|
sub get_insert_moreflds_str {
 | 
						|
	my $s = "";
 | 
						|
	for (my $i = 0; $i < $num_moreflds; ++$i) {
 | 
						|
		$s .= ",?";
 | 
						|
	}
 | 
						|
	return $s;
 | 
						|
}
 | 
						|
 |