15
15
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
18
package GenTest::Server::MySQL;
18
package GenTest::Server::MySQLd;
20
20
@ISA = qw(GenTest);
24
use GenTest::Constants;
24
25
use if windows(), Win32::Process;
31
33
use constant MYSQLD_BASEDIR => 0;
32
use constant MYSQLD_DATADIR => 1;
33
use constant MYSQLD_PORTBASE => 2;
34
use constant MYSQLD_MYSQLD => 3;
35
use constant MYSQLD_LIBMYSQL => 4;
36
use constant MYSQLD_BOOT_SQL => 5;
37
use constant MYSQLD_STDOPTS => 6;
38
use constant MYSQLD_MESSAGES => 7;
39
use constant MYSQLD_SERVER_OPTIONS => 8;
40
use constant MYSQLD_AUXPID => 9;
41
use constant MYSQLD_SERVERPID => 10;
42
use constant MYSQLD_WINDOWS_PROCESS => 11;
43
use constant MYSQLD_DBH => 12;
44
use constant MYSQLD_DRH => 12;
34
use constant MYSQLD_VARDIR => 1;
35
use constant MYSQLD_DATADIR => 2;
36
use constant MYSQLD_PORT => 3;
37
use constant MYSQLD_MYSQLD => 4;
38
use constant MYSQLD_LIBMYSQL => 5;
39
use constant MYSQLD_BOOT_SQL => 6;
40
use constant MYSQLD_STDOPTS => 7;
41
use constant MYSQLD_MESSAGES => 8;
42
use constant MYSQLD_SERVER_OPTIONS => 9;
43
use constant MYSQLD_AUXPID => 10;
44
use constant MYSQLD_SERVERPID => 11;
45
use constant MYSQLD_WINDOWS_PROCESS => 12;
46
use constant MYSQLD_DBH => 13;
46
48
use constant MYSQLD_PID_FILE => "mysql.pid";
47
49
use constant MYSQLD_SOCKET_FILE => "mysql.sock";
48
50
use constant MYSQLD_LOG_FILE => "mysql.err";
49
use constant MYSQLD_DEFAULT_PORTBASE => 19300;
51
use constant MYSQLD_DEFAULT_PORT => 19300;
50
52
use constant MYSQLD_DEFAULT_DATABASE => "test";
57
59
my $self = $class->SUPER::new({'basedir' => MYSQLD_BASEDIR,
58
'datadir' => MYSQLD_DATADIR,
59
'portbase' => MYSQLD_PORTBASE,
60
'vardir' => MYSQLD_VARDIR,
61
'port' => MYSQLD_PORT,
60
62
'server_options' => MYSQLD_SERVER_OPTIONS},@_);
65
if (not defined $self->[MYSQLD_VARDIR]) {
66
$self->[MYSQLD_VARDIR] = "mysql-test/var";
69
if ($self->vardir =~ m/^\//) {
71
$self->[MYSQLD_VARDIR] = $self->basedir."/".$self->vardir;
74
$self->[MYSQLD_DATADIR] = $self->[MYSQLD_VARDIR]."/data";
63
## Use unix-style path's since that's what Perl expects...
64
$self->[MYSQLD_BASEDIR] =~ s/\\/\//g;
65
$self->[MYSQLD_DATADIR] =~ s/\\/\//g;
77
## Use unix-style path's since that's what Perl expects...
78
$self->[MYSQLD_BASEDIR] =~ s/\\/\//g;
79
$self->[MYSQLD_VARDIR] =~ s/\\/\//g;
80
$self->[MYSQLD_DATADIR] =~ s/\\/\//g;
68
83
$self->[MYSQLD_MYSQLD] = $self->_find($self->basedir,
69
windows()?["sql/Debug"]:["sql","libexec"],
70
windows()?"mysqld.exe":"mysqld");
84
windows()?["sql/Debug"]:["sql","libexec"],
85
windows()?"mysqld.exe":"mysqld");
71
86
$self->[MYSQLD_BOOT_SQL] = [];
72
87
foreach my $file ("mysql_system_tables.sql",
73
"mysql_system_tables_data.sql",
74
"mysql_test_data_timezone.sql",
75
"fill_help_tables.sql") {
88
"mysql_system_tables_data.sql",
89
"mysql_test_data_timezone.sql",
90
"fill_help_tables.sql") {
76
91
push(@{$self->[MYSQLD_BOOT_SQL]},
77
92
$self->_find($self->basedir,["scripts","share/mysql"], $file));
80
95
$self->[MYSQLD_MESSAGES] = $self->_findDir($self->basedir, ["sql/share","share/mysql"], "errmsg-utf8.txt");
82
97
$self->[MYSQLD_LIBMYSQL] = $self->_findDir($self->basedir,
83
windows()?["libmysql/Debug"]:["libmysql/.libs","lib/mysql"],
84
windows()?"libmysql.dll":"libmysqlclient.so");
98
windows()?["libmysql/Debug"]:["libmysql/.libs","lib/mysql"],
99
windows()?"libmysql.dll":"libmysqlclient.so");
86
101
$self->[MYSQLD_STDOPTS] = [join(" ",
87
102
"--basedir=".$self->basedir,
88
103
"--datadir=".$self->datadir,
89
104
"--lc-messages-dir=".$self->[MYSQLD_MESSAGES],
90
105
windows()?"":"--loose-skip-innodb",
91
windows()?"":"--loose-skip-ndbcluster",
92
106
"--default-storage-engine=myisam",
93
107
"--log-warnings=0")];
95
$self->[MYSQLD_DRH] = DBI->install_driver('mysql');
97
109
$self->createMysqlBase;
107
119
return $_[0]->[MYSQLD_DATADIR];
123
return $_[0]->[MYSQLD_VARDIR];
113
if (defined $self->[MYSQLD_PORTBASE]) {
114
return $self->[MYSQLD_PORTBASE];
129
if (defined $self->[MYSQLD_PORT]) {
130
return $self->[MYSQLD_PORT];
116
return MYSQLD_DEFAULT_PORTBASE;
132
return MYSQLD_DEFAULT_PORT;
129
return $_[0]->datadir."/".MYSQLD_SOCKET_FILE;
145
return $_[0]->vardir."/".MYSQLD_SOCKET_FILE;
133
return $_[0]->datadir."/".MYSQLD_PID_FILE;
149
return $_[0]->vardir."/".MYSQLD_PID_FILE;
137
return $_[0]->datadir."/".MYSQLD_LOG_FILE;
153
return $_[0]->vardir."/".MYSQLD_LOG_FILE;
140
156
sub libmysqldir {
147
163
## 1. Clean old db if any
148
if (-d $self->datadir) {
164
if (-d $self->vardir) {
150
my $datadir = $self->datadir;
151
$datadir =~ s/\//\\/g;
152
system("rmdir /s /q $datadir");
166
my $vardir = $self->vardir;
167
$vardir =~ s/\//\\/g;
168
system("rmdir /s /q $vardir");
154
system("rm -rf ".$self->datadir);
170
system("rm -rf ".$self->vardir);
158
174
## 2. Create database directory structure
159
176
mkdir $self->datadir;
160
177
mkdir $self->datadir."/mysql";
161
178
mkdir $self->datadir."/test";
163
180
## 3. Create boot file
164
my $boot = $self->datadir."/boot.sql";
181
my $boot = $self->vardir."/boot.sql";
165
182
open BOOT,">$boot";
167
184
## Set curren database
208
225
my $opts = join(' ',
210
227
@{$self->[MYSQLD_STDOPTS]},
212
"--port=".$self->portbase,
213
"--socket=".MYSQLD_SOCKET_FILE,
214
"--pid-file=".MYSQLD_PID_FILE);
232
"--relay-log=slave-relay-bin",
234
"--max-allowed-packet=16Mb", # Allow loading bigger blobs
235
"--loose-innodb-status-file=1",
236
"--master-retry-count=65535",
237
"--port=".$self->port,
238
"--socket=".$self->socketfile,
239
"--pid-file=".$self->pidfile,
240
"--general-log-file=".$self->logfile);
215
241
if (defined $self->[MYSQLD_SERVER_OPTIONS]) {
216
242
$opts = $opts." ".$self->[MYSQLD_SERVER_OPTIONS]->genOpt();
219
my $serverlog = $self->datadir."/".MYSQLD_LOG_FILE;
245
my $serverlog = $self->vardir."/".MYSQLD_LOG_FILE;
223
249
my $command = "mysqld.exe"." ".$opts;
224
250
my $exe = $self->[MYSQLD_MYSQLD];
225
my $datadir = $self->[MYSQLD_DATADIR];
251
my $vardir = $self->[MYSQLD_VARDIR];
226
252
$command =~ s/\//\\/g;
227
253
$exe =~ s/\//\\/g;
228
$datadir =~ s/\//\\/g;
229
say("Starting: $exe as $command on $datadir");
254
$vardir =~ s/\//\\/g;
255
say("Starting: $exe as $command on $vardir");
230
256
Win32::Process::Create($proc,
240
266
say("Starting: $command");
241
267
$self->[MYSQLD_AUXPID] = fork();
242
268
if ($self->[MYSQLD_AUXPID]) {
243
sleep(1); ## Wait to be sure that the PID file is there
269
## Waht for the pid file to have been created
271
while (!-f $self->pidfile && $waits < 100) {
272
Time::HiRes::sleep(0.2);
244
275
my $pidfile = $self->pidfile;
245
276
my $pid = `cat $pidfile`;
246
277
$pid =~ m/([0-9]+)/;
257
288
{PrintError => 1,
259
290
AutoCommit => 1});
263
292
$self->[MYSQLD_DBH] = $dbh;
294
return $dbh ? STATUS_OK : STATUS_ENVIRONMENT_FAILURE;
270
$self->[MYSQLD_WINDOWS_PROCESS]->Kill(0);
301
if (defined $self->[MYSQLD_WINDOWS_PROCESS]) {
302
$self->[MYSQLD_WINDOWS_PROCESS]->Kill(0);
303
say("Killed process ".$self->[MYSQLD_WINDOWS_PROCESS]->GetProcessId());
272
kill KILL => $self->serverpid;
306
if (defined $self->serverpid) {
307
kill KILL => $self->serverpid;
308
say("Killed process ".$self->serverpid);
279
my $r = $self->[MYSQLD_DRH]->func('shutdown','127.0.0.1','root',undef,'admin');
281
say("Server would not shut down properly");
316
if (defined $self->[MYSQLD_DBH]) {
317
say("Stopping server on port ".$self->port);
318
my $r = $self->[MYSQLD_DBH]->func('shutdown','127.0.0.1','root','admin');
320
say("Server would not shut down properly");
297
339
my ($self,$database) = @_;
298
340
$database = "test" if not defined MYSQLD_DEFAULT_DATABASE;
299
341
return "dbi:mysql:host=127.0.0.1:port=".
300
$self->[MYSQLD_PORTBASE].
342
$self->[MYSQLD_PORT].
301
343
":user=root:database=".$database;