9
use Net::HandlerSocket;
13
my ($k, $v) = split(/=/, $i);
17
my $verbose = get_conf("verbose", 0);
18
my $actions_str = get_conf("actions", "hsread");
19
my $tablesize = get_conf("tablesize", 10000);
20
my $db = get_conf("db", "hstest");
21
my $table = get_conf("table", "hstest_table1");
22
my $engine = get_conf("engine", "innodb");
23
my $host = get_conf("host", "localhost");
24
my $mysqlport = get_conf("mysqlport", 3306);
25
my $mysqluser = get_conf("mysqluser", "root");
26
my $mysqlpass = get_conf("mysqlpass", "");
27
my $hsport = get_conf("hsport", 9999);
28
my $loop = get_conf("loop", 10000);
29
my $op = get_conf("op", "=");
30
my $ssps = get_conf("ssps", 0);
31
my $num_moreflds = get_conf("moreflds", 0);
32
my $moreflds_prefix = get_conf("moreflds_prefix", "column0123456789_");
33
my $keytype = get_conf("keytype", "varchar(32)");
34
my $file = get_conf("file", undef);
36
my $dsn = "DBI:mysql:database=;host=$host;port=$mysqlport"
37
. ";mysql_server_prepare=$ssps";
38
my $dbh = DBI->connect($dsn, $mysqluser, $mysqlpass, { RaiseError => 1 });
39
my $hsargs = { 'host' => $host, 'port' => $hsport };
40
my $cli = new Net::HandlerSocket($hsargs);
42
my @actions = split(/,/, $actions_str);
43
for my $action (@actions) {
44
if ($action eq "table") {
45
print("TABLE $db.$table\n");
46
$dbh->do("drop database if exists $db");
47
$dbh->do("create database $db");
49
my $moreflds = get_createtbl_moreflds_str();
51
"create table $table (" .
52
"k $keytype primary key" .
53
",v varchar(32) not null" .
55
") character set utf8 collate utf8_bin " .
57
} elsif ($action eq "insert") {
58
print("INSERT $db.$table tablesize=$tablesize\n");
60
my $moreflds = get_insert_moreflds_str();
61
for (my $i = 0; $i < $tablesize; $i += 100) {
62
my $qstr = "insert into $db.$table values";
63
for (my $j = 0; $j < 100; ++$j) {
67
my $k = "" . ($i + $j);
68
my $v = "v" . int(rand(1000)) . ($i + $j);
69
$qstr .= "('$k', '$v'";
70
for (my $j = 0; $j < $num_moreflds; ++$j) {
76
print "$i/$tablesize\n" if $i % 1000 == 0;
78
} elsif ($action eq "read") {
79
print("READ $db.$table op=$op loop=$loop\n");
81
my $moreflds = get_select_moreflds_str();
82
my $sth = $dbh->prepare(
83
"select k,v$moreflds from $db.$table where k = ?");
84
for (my $i = 0; $i < $loop; ++$i) {
85
my $k = "" . int(rand($tablesize));
90
while (my $ref = $sth->fetchrow_arrayref()) {
97
print "$i/$loop\n" if $i % 1000 == 0;
99
} elsif ($action eq "hsinsert") {
100
print("HSINSERT $db.$table tablesize=$tablesize\n");
101
$cli->open_index(1, $db, $table, '', 'k,v');
102
for (my $i = 0; $i < $tablesize; ++$i) {
104
my $v = "v" . int(rand(1000)) . $i;
105
my $r = $cli->execute_insert(1, [ $k, $v ]);
109
print "$i/$tablesize\n" if $i % 1000 == 0;
111
} elsif ($action eq "hsread") {
112
print("HSREAD $db.$table op=$op loop=$loop\n");
113
my $moreflds = get_select_moreflds_str();
114
$cli->open_index(1, $db, $table, '', "k,v$moreflds");
115
for (my $i = 0; $i < $loop; ++$i) {
116
my $k = "" . int(rand($tablesize));
118
my $r = $cli->execute_find(1, $op, [ $k ], 1, 0);
119
if ($verbose >= 10) {
120
my $len = scalar(@{$r});
127
print "$i/$loop\n" if $i % 1000 == 0;
129
} elsif ($action eq "hsupdate") {
130
my $vbase = "v" . int(rand(1000));
131
print("HSUPDATE $db.$table op=$op loop=$loop vbase=$vbase\n");
132
$cli->open_index(1, $db, $table, '', 'v');
133
for (my $i = 0; $i < $loop; ++$i) {
134
my $k = "" . int(rand($tablesize));
137
my $r = $cli->execute_update(1, $op, [ $k ], 1, 0,
139
if ($verbose >= 10) {
140
print "UP k=$k v=$v\n";
142
print "$i/$loop\n" if $i % 1000 == 0;
144
} elsif ($action eq "hsdelete") {
145
print("HSDELETE $db.$table op=$op loop=$loop\n");
146
$cli->open_index(1, $db, $table, '', '');
147
for (my $i = 0; $i < $loop; ++$i) {
148
my $k = "" . int(rand($tablesize));
150
my $r = $cli->execute_delete(1, $op, [ $k ], 1, 0);
151
if ($verbose >= 10) {
154
print "$i/$loop\n" if $i % 1000 == 0;
156
} elsif ($action eq "verify") {
162
my ($fail_cnt, $ok_cnt) = (0, 0);
163
my $sth = $dbh->prepare("select v from $db.$table where k = ?");
165
my $fh = new FileHandle($file, "r");
166
while (my $line = <$fh>) {
168
my @vec = split(/\t/, $line);
171
next if (!defined($k) || !defined($v));
174
my $aref = $sth->fetchrow_arrayref();
175
if (!defined($aref)) {
176
print "FAILED: $k notfound\n";
181
print "FAILED: $k got=$gv expected=$v\n";
184
print "OK: $k $v $gv\n" if $verbose >= 10;
189
print "OK=$ok_cnt FAIL=$fail_cnt\n";
193
my ($key, $def) = @_;
194
my $val = $conf{$key};
200
print "$key=$def(default)\n";
205
sub get_createtbl_moreflds_str {
207
for (my $j = 0; $j < $num_moreflds; ++$j) {
208
$s .= ",$moreflds_prefix$j varchar(30)";
213
sub get_select_moreflds_str {
215
for (my $i = 0; $i < $num_moreflds; ++$i) {
216
$s .= ",$moreflds_prefix$i";
221
sub get_insert_moreflds_str {
223
for (my $i = 0; $i < $num_moreflds; ++$i) {