#!/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;
}
Messung V0.5 in Prozent C=98 H=28 G=71
¤ Dauer der Verarbeitung: 0.27 Sekunden
(vorverarbeitet am 2026-10-08)
¤
*© Formatika GbR, Deutschland