mirror of
				https://github.com/MariaDB/server.git
				synced 2025-11-04 04:46:15 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			224 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
	
		
			5.4 KiB
		
	
	
	
		
			Perl
		
	
	
		
			Executable file
		
	
	
	
	
#!/usr/bin/env perl
 | 
						|
 | 
						|
use strict;
 | 
						|
use warnings;
 | 
						|
use DB::HandlerSocket::Pool;
 | 
						|
use DBI;
 | 
						|
 | 
						|
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",
 | 
						|
	"create,insert,verify,verify2,verify3,verify4,clean");
 | 
						|
my $tablesize = get_conf("tablesize", 1000);
 | 
						|
my $db = get_conf("db", "hstestdb");
 | 
						|
my $table = get_conf("table", "testtbl");
 | 
						|
my $table_schema = get_conf("table_schema", undef);
 | 
						|
my $engine = get_conf("engine", "innodb");
 | 
						|
my $host = get_conf("host", "localhost");
 | 
						|
my $mysqlport = get_conf("mysqlport", 3306);
 | 
						|
my $hsport_rd = get_conf("hsport_rd", 9998);
 | 
						|
my $hsport_wr = get_conf("hsport_wr", 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", "f");
 | 
						|
my $mysql_user = 'root';
 | 
						|
my $mysql_password = '';
 | 
						|
 | 
						|
my $dsn = "DBI:MariaDB:database=;host=$host;port=$mysqlport"
 | 
						|
        . ";mariadb_server_prepare=$ssps";
 | 
						|
my $dbh = DBI->connect($dsn, $mysql_user, $mysql_password,
 | 
						|
	{ RaiseError => 1 });
 | 
						|
my $hsargs = { 'host' => $host, 'port' => $hsport_rd };
 | 
						|
my $hspool = new DB::HandlerSocket::Pool({
 | 
						|
	hostmap => {
 | 
						|
		"$db.$table" => {
 | 
						|
			host => $host,
 | 
						|
			port => $hsport_rd,
 | 
						|
		},
 | 
						|
	},
 | 
						|
	resolve => undef,
 | 
						|
	error => undef,
 | 
						|
});
 | 
						|
$table_schema = "(k int primary key, fc30 varchar(30), ft text)"
 | 
						|
	if (!defined($table_schema));
 | 
						|
 | 
						|
my @actions = split(/,/, $actions_str);
 | 
						|
for my $action (@actions) {
 | 
						|
	print "ACTION: $action\n";
 | 
						|
	eval "hstest_$action()";
 | 
						|
	if ($@) {
 | 
						|
		die $@;
 | 
						|
	}
 | 
						|
	print "ACTION: $action DONE\n";
 | 
						|
}
 | 
						|
 | 
						|
sub get_conf {
 | 
						|
	my ($key, $def) = @_;
 | 
						|
	my $val = $conf{$key};
 | 
						|
	if ($val) {
 | 
						|
		print "$key=$val\n";
 | 
						|
	} else {
 | 
						|
		$val = $def;
 | 
						|
		my $defstr = $def || "(undef)";
 | 
						|
		print "$key=$defstr(default)\n";
 | 
						|
	}
 | 
						|
	return $val;
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_create {
 | 
						|
	$dbh->do("drop database if exists $db");
 | 
						|
	$dbh->do("create database $db");
 | 
						|
	$dbh->do("use $db");
 | 
						|
	$dbh->do("create table $table $table_schema engine=$engine");
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_dump {
 | 
						|
	$dbh->do("use $db");
 | 
						|
	my $sth = $dbh->prepare("select * from $table");
 | 
						|
	$sth->execute();
 | 
						|
	my $arr = $sth->fetchall_arrayref();
 | 
						|
	for my $rec (@$arr) {
 | 
						|
		print "REC:";
 | 
						|
		for my $row (@$rec) {
 | 
						|
			print " $row";
 | 
						|
		}
 | 
						|
		print "\n";
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_insert {
 | 
						|
	$dbh->do("use $db");
 | 
						|
	my $sth = $dbh->prepare("insert into $table values (?, ?, ?)");
 | 
						|
	for (my $k = 0; $k < $tablesize; ++$k) {
 | 
						|
		my $fc30 = "fc30_$k";
 | 
						|
		my $ft = "ft_$k";
 | 
						|
		$sth->execute($k, $fc30, $ft);
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_verify {
 | 
						|
	$dbh->do("use $db");
 | 
						|
	my $sth = $dbh->prepare("select * from $table order by k");
 | 
						|
	$sth->execute();
 | 
						|
	my $arr = $sth->fetchall_arrayref();
 | 
						|
	my $hsres = $hspool->index_find($db, $table, "PRIMARY", "k,fc30,ft",
 | 
						|
		">=", [ 0 ], $tablesize, 0);
 | 
						|
	for (my $i = 0; $i < $tablesize; ++$i) {
 | 
						|
		my $rec = $arr->[$i];
 | 
						|
		my $differ = 0;
 | 
						|
		print "REC:" if $verbose;
 | 
						|
		for (my $j = 0; $j < 3; ++$j) {
 | 
						|
			my $fld = $rec->[$j];
 | 
						|
			my $hsidx = $i * 3 + $j;
 | 
						|
			my $hsfld = $hsres->[$hsidx];
 | 
						|
			if ($hsfld ne $fld) {
 | 
						|
				$differ = 1;
 | 
						|
			}
 | 
						|
			if ($differ) {
 | 
						|
				print " $fld:$hsfld" if $verbose;
 | 
						|
			} else {
 | 
						|
				print " $hsfld" if $verbose;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		print "\n" if $verbose;
 | 
						|
		if ($differ) {
 | 
						|
			die "verification failed";
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_verify2 {
 | 
						|
	$dbh->do("use $db");
 | 
						|
	my $sth = $dbh->prepare("select * from $table order by k");
 | 
						|
	$sth->execute();
 | 
						|
	my $arr = $sth->fetchall_arrayref();
 | 
						|
	my $hsresa = $hspool->index_find_multi($db, $table, "PRIMARY",
 | 
						|
		"k,fc30,ft", [ [ -1, ">=", [ 0 ], $tablesize, 0 ] ]);
 | 
						|
	my $hsres = $hsresa->[0];
 | 
						|
	for (my $i = 0; $i < $tablesize; ++$i) {
 | 
						|
		my $rec = $arr->[$i];
 | 
						|
		my $differ = 0;
 | 
						|
		print "REC:" if $verbose;
 | 
						|
		for (my $j = 0; $j < 3; ++$j) {
 | 
						|
			my $fld = $rec->[$j];
 | 
						|
			my $hsidx = $i * 3 + $j;
 | 
						|
			my $hsfld = $hsres->[$hsidx];
 | 
						|
			if ($hsfld ne $fld) {
 | 
						|
				$differ = 1;
 | 
						|
			}
 | 
						|
			if ($differ) {
 | 
						|
				print " $fld:$hsfld" if $verbose;
 | 
						|
			} else {
 | 
						|
				print " $hsfld" if $verbose;
 | 
						|
			}
 | 
						|
		}
 | 
						|
		print "\n" if $verbose;
 | 
						|
		if ($differ) {
 | 
						|
			die "verification failed";
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub hashref_to_str {
 | 
						|
	my $href = $_[0];
 | 
						|
	my $r = '';
 | 
						|
	for my $k (sort keys %$href) {
 | 
						|
		my $v = $href->{$k};
 | 
						|
		$r .= "($k=>$v)";
 | 
						|
	}
 | 
						|
	return $r;
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_verify3 {
 | 
						|
	$dbh->do("use $db");
 | 
						|
	my $sth = $dbh->prepare("select * from $table order by k");
 | 
						|
	$sth->execute();
 | 
						|
	my $hsres_t = $hspool->index_find($db, $table, "PRIMARY", "k,fc30,ft",
 | 
						|
			">=", [ 0 ], $tablesize, 0);
 | 
						|
	my $hsres = DB::HandlerSocket::Pool::result_single_to_hasharr(
 | 
						|
		[ 'k', 'fc30', 'ft' ], $hsres_t);
 | 
						|
	for (my $i = 0; $i < $tablesize; ++$i) {
 | 
						|
		my $mystr = hashref_to_str($sth->fetchrow_hashref());
 | 
						|
		my $hsstr = hashref_to_str($hsres->[$i]);
 | 
						|
		if ($mystr ne $hsstr) {
 | 
						|
			print "DIFF my=[$mystr] hs=[$hsstr]\n" if $verbose;
 | 
						|
			die "verification failed";
 | 
						|
		} else {
 | 
						|
			print "OK $hsstr\n" if $verbose;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_verify4 {
 | 
						|
	$dbh->do("use $db");
 | 
						|
	my $sth = $dbh->prepare("select * from $table order by k");
 | 
						|
	$sth->execute();
 | 
						|
	my $hsres_t = $hspool->index_find($db, $table, "PRIMARY", "k,fc30,ft",
 | 
						|
			">=", [ 0 ], $tablesize, 0);
 | 
						|
	my $hsres = DB::HandlerSocket::Pool::result_single_to_hashhash(
 | 
						|
		[ 'k', 'fc30', 'ft' ], 'k', $hsres_t);
 | 
						|
	my $rechash = $sth->fetchall_hashref('k');
 | 
						|
	while (my ($k, $href) = each (%$rechash)) {
 | 
						|
		my $mystr = hashref_to_str($href);
 | 
						|
		my $hsstr = hashref_to_str($hsres->{$k});
 | 
						|
		if ($mystr ne $hsstr) {
 | 
						|
			print "DIFF my=[$mystr] hs=[$hsstr]\n" if $verbose;
 | 
						|
			die "verification failed";
 | 
						|
		} else {
 | 
						|
			print "OK $hsstr\n" if $verbose;
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
sub hstest_clean {
 | 
						|
	$hspool->clear_pool();
 | 
						|
	$dbh->do("drop database if exists $db");
 | 
						|
}
 | 
						|
 |