line |
stmt |
bran |
cond |
sub |
pod |
time |
code |
1
|
|
|
|
|
|
|
package DBIx::QuickDB::Driver::MySQL; |
2
|
6
|
|
|
6
|
|
355197
|
use strict; |
|
6
|
|
|
|
|
23
|
|
|
6
|
|
|
|
|
145
|
|
3
|
6
|
|
|
6
|
|
29
|
use warnings; |
|
6
|
|
|
|
|
16
|
|
|
6
|
|
|
|
|
202
|
|
4
|
|
|
|
|
|
|
|
5
|
|
|
|
|
|
|
our $VERSION = '0.000022'; |
6
|
|
|
|
|
|
|
|
7
|
6
|
|
|
6
|
|
2697
|
use IPC::Cmd qw/can_run/; |
|
6
|
|
|
|
|
192095
|
|
|
6
|
|
|
|
|
301
|
|
8
|
6
|
|
|
6
|
|
1940
|
use DBIx::QuickDB::Util qw/strip_hash_defaults/; |
|
6
|
|
|
|
|
17
|
|
|
6
|
|
|
|
|
52
|
|
9
|
6
|
|
|
6
|
|
188
|
use Scalar::Util qw/reftype/; |
|
6
|
|
|
|
|
10
|
|
|
6
|
|
|
|
|
290
|
|
10
|
6
|
|
|
6
|
|
32
|
use Carp qw/confess/; |
|
6
|
|
|
|
|
11
|
|
|
6
|
|
|
|
|
204
|
|
11
|
|
|
|
|
|
|
|
12
|
6
|
|
|
6
|
|
716
|
use parent 'DBIx::QuickDB::Driver'; |
|
6
|
|
|
|
|
497
|
|
|
6
|
|
|
|
|
53
|
|
13
|
|
|
|
|
|
|
|
14
|
6
|
|
|
|
|
27
|
use DBIx::QuickDB::Util::HashBase qw{ |
15
|
|
|
|
|
|
|
-data_dir -temp_dir -socket -pid_file -cfg_file |
16
|
|
|
|
|
|
|
|
17
|
|
|
|
|
|
|
-mysqld -mysql |
18
|
|
|
|
|
|
|
|
19
|
|
|
|
|
|
|
-dbd_driver |
20
|
|
|
|
|
|
|
-mysqld_provider |
21
|
|
|
|
|
|
|
-use_bootstrap |
22
|
|
|
|
|
|
|
-use_installdb |
23
|
|
|
|
|
|
|
|
24
|
|
|
|
|
|
|
-character_set_server |
25
|
|
|
|
|
|
|
|
26
|
|
|
|
|
|
|
-config |
27
|
6
|
|
|
6
|
|
325
|
}; |
|
6
|
|
|
|
|
13
|
|
28
|
|
|
|
|
|
|
|
29
|
|
|
|
|
|
|
my ($MYSQLD, $MYSQL, $DBDMYSQL, $DBDMARIA, $INSTALLDB); |
30
|
|
|
|
|
|
|
|
31
|
|
|
|
|
|
|
BEGIN { |
32
|
6
|
|
|
6
|
|
24
|
local $@; |
33
|
|
|
|
|
|
|
|
34
|
6
|
|
|
|
|
23
|
$MYSQLD = can_run('mysqld'); |
35
|
6
|
|
|
|
|
1573
|
$MYSQL = can_run('mysql'); |
36
|
6
|
|
|
|
|
1421
|
$INSTALLDB = can_run('mysql_install_db'); |
37
|
6
|
50
|
|
|
|
1401
|
if ($INSTALLDB = can_run('mysql_install_db')) { |
38
|
0
|
|
|
|
|
0
|
my $output = `$INSTALLDB 2>&1`; |
39
|
0
|
0
|
|
|
|
0
|
$INSTALLDB = undef if $output =~ m/mysql_install_db is deprecated/; |
40
|
|
|
|
|
|
|
} |
41
|
|
|
|
|
|
|
|
42
|
6
|
|
|
|
|
1416
|
$DBDMYSQL = eval { require DBD::mysql; 'DBD::mysql' }; |
|
6
|
|
|
|
|
683
|
|
|
0
|
|
|
|
|
0
|
|
43
|
6
|
|
|
|
|
22
|
$DBDMARIA = eval { require DBD::MariaDB; 'DBD::MariaDB' }; |
|
6
|
|
|
|
|
11486
|
|
|
0
|
|
|
|
|
0
|
|
44
|
|
|
|
|
|
|
} |
45
|
|
|
|
|
|
|
|
46
|
|
|
|
|
|
|
sub version_string { |
47
|
0
|
|
|
0
|
1
|
0
|
my $binary; |
48
|
|
|
|
|
|
|
|
49
|
|
|
|
|
|
|
# Go in reverse order assuming the last param hash provided is most important |
50
|
0
|
|
|
|
|
0
|
for my $arg (reverse @_) { |
51
|
0
|
0
|
|
|
|
0
|
my $type = reftype($arg) or next; # skip if not a ref |
52
|
0
|
0
|
|
|
|
0
|
next unless $type eq 'HASH'; # We have a hashref, possibly blessed |
53
|
|
|
|
|
|
|
|
54
|
|
|
|
|
|
|
# If we find a launcher we are done looping, we want to use this binary. |
55
|
0
|
0
|
|
|
|
0
|
$binary = $arg->{+MYSQLD} and last; |
56
|
|
|
|
|
|
|
} |
57
|
|
|
|
|
|
|
|
58
|
|
|
|
|
|
|
# If no args provided one to use we fallback to the default from $PATH |
59
|
0
|
|
0
|
|
|
0
|
$binary ||= $MYSQLD; |
60
|
|
|
|
|
|
|
|
61
|
|
|
|
|
|
|
# Call the binary with '-V', capturing and returning the output using backticks. |
62
|
0
|
|
|
|
|
0
|
return `$binary -V`; |
63
|
|
|
|
|
|
|
} |
64
|
|
|
|
|
|
|
|
65
|
|
|
|
|
|
|
sub list_env_vars { |
66
|
0
|
|
|
0
|
1
|
0
|
my $self = shift; |
67
|
|
|
|
|
|
|
return ( |
68
|
0
|
|
|
|
|
0
|
$self->SUPER::list_env_vars(), |
69
|
|
|
|
|
|
|
qw{ |
70
|
|
|
|
|
|
|
LIBMYSQL_ENABLE_CLEARTEXT_PLUGIN LIBMYSQL_PLUGINS |
71
|
|
|
|
|
|
|
LIBMYSQL_PLUGIN_DIR MYSQLX_TCP_PORT MYSQLX_UNIX_PORT MYSQL_DEBUG |
72
|
|
|
|
|
|
|
MYSQL_GROUP_SUFFIX MYSQL_HISTFILE MYSQL_HISTIGNORE MYSQL_HOME |
73
|
|
|
|
|
|
|
MYSQL_HOST MYSQL_OPENSSL_UDF_DH_BITS_THRESHOLD |
74
|
|
|
|
|
|
|
MYSQL_OPENSSL_UDF_DSA_BITS_THRESHOLD |
75
|
|
|
|
|
|
|
MYSQL_OPENSSL_UDF_RSA_BITS_THRESHOLD MYSQL_PS1 MYSQL_PWD |
76
|
|
|
|
|
|
|
MYSQL_SERVER_PREPARE MYSQL_TCP_PORT MYSQL_TEST_LOGIN_FILE |
77
|
|
|
|
|
|
|
MYSQL_TEST_TRACE_CRASH MYSQL_TEST_TRACE_DEBUG MYSQL_UNIX_PORT |
78
|
|
|
|
|
|
|
} |
79
|
|
|
|
|
|
|
); |
80
|
|
|
|
|
|
|
} |
81
|
|
|
|
|
|
|
|
82
|
|
|
|
|
|
|
sub _default_paths { |
83
|
|
|
|
|
|
|
return ( |
84
|
6
|
|
|
6
|
|
35
|
mysqld => $MYSQLD, |
85
|
|
|
|
|
|
|
mysql => $MYSQL, |
86
|
|
|
|
|
|
|
); |
87
|
|
|
|
|
|
|
} |
88
|
|
|
|
|
|
|
|
89
|
|
|
|
|
|
|
sub _default_config { |
90
|
0
|
|
|
0
|
|
0
|
my $self = shift; |
91
|
|
|
|
|
|
|
|
92
|
0
|
|
|
|
|
0
|
my $dir = $self->dir; |
93
|
0
|
|
|
|
|
0
|
my $data_dir = $self->data_dir; |
94
|
0
|
|
|
|
|
0
|
my $temp_dir = $self->temp_dir; |
95
|
0
|
|
|
|
|
0
|
my $pid_file = $self->pid_file; |
96
|
0
|
|
|
|
|
0
|
my $socket = $self->socket; |
97
|
|
|
|
|
|
|
|
98
|
0
|
|
|
|
|
0
|
my $provider = $self->{+MYSQLD_PROVIDER}; |
99
|
|
|
|
|
|
|
|
100
|
|
|
|
|
|
|
return ( |
101
|
|
|
|
|
|
|
client => { |
102
|
|
|
|
|
|
|
'socket' => $socket, |
103
|
|
|
|
|
|
|
}, |
104
|
|
|
|
|
|
|
|
105
|
|
|
|
|
|
|
mysql_safe => { |
106
|
|
|
|
|
|
|
'socket' => $socket, |
107
|
|
|
|
|
|
|
}, |
108
|
|
|
|
|
|
|
|
109
|
|
|
|
|
|
|
mysqld => { |
110
|
|
|
|
|
|
|
'datadir' => $data_dir, |
111
|
|
|
|
|
|
|
'pid-file' => $pid_file, |
112
|
|
|
|
|
|
|
'socket' => $socket, |
113
|
|
|
|
|
|
|
'tmpdir' => $temp_dir, |
114
|
|
|
|
|
|
|
|
115
|
|
|
|
|
|
|
'secure_file_priv' => $dir, |
116
|
|
|
|
|
|
|
'default_storage_engine' => 'InnoDB', |
117
|
|
|
|
|
|
|
'innodb_buffer_pool_size' => '20M', |
118
|
|
|
|
|
|
|
'key_buffer_size' => '20M', |
119
|
|
|
|
|
|
|
'max_connections' => '100', |
120
|
|
|
|
|
|
|
'server-id' => '1', |
121
|
|
|
|
|
|
|
'skip_grant_tables' => '1', |
122
|
|
|
|
|
|
|
'skip_external_locking' => '', |
123
|
|
|
|
|
|
|
'skip_networking' => '1', |
124
|
|
|
|
|
|
|
'skip_name_resolve' => '1', |
125
|
|
|
|
|
|
|
'max_allowed_packet' => '1M', |
126
|
|
|
|
|
|
|
'max_binlog_size' => '20M', |
127
|
|
|
|
|
|
|
'myisam_sort_buffer_size' => '8M', |
128
|
|
|
|
|
|
|
'net_buffer_length' => '8K', |
129
|
|
|
|
|
|
|
'read_buffer_size' => '256K', |
130
|
|
|
|
|
|
|
'read_rnd_buffer_size' => '512K', |
131
|
|
|
|
|
|
|
'sort_buffer_size' => '512K', |
132
|
|
|
|
|
|
|
'table_open_cache' => '64', |
133
|
|
|
|
|
|
|
'thread_cache_size' => '8', |
134
|
|
|
|
|
|
|
'thread_stack' => '192K', |
135
|
|
|
|
|
|
|
'innodb_io_capacity' => '2000', |
136
|
|
|
|
|
|
|
'innodb_max_dirty_pages_pct' => '0', |
137
|
|
|
|
|
|
|
'innodb_max_dirty_pages_pct_lwm' => '0', |
138
|
|
|
|
|
|
|
|
139
|
|
|
|
|
|
|
$provider eq 'percona' |
140
|
|
|
|
|
|
|
? ( |
141
|
|
|
|
|
|
|
'character_set_server' => $self->{+CHARACTER_SET_SERVER}, |
142
|
|
|
|
|
|
|
) |
143
|
|
|
|
|
|
|
: ( |
144
|
0
|
0
|
|
|
|
0
|
'character_set_server' => $self->{+CHARACTER_SET_SERVER}, |
145
|
|
|
|
|
|
|
'query_cache_limit' => '1M', |
146
|
|
|
|
|
|
|
'query_cache_size' => '20M', |
147
|
|
|
|
|
|
|
), |
148
|
|
|
|
|
|
|
}, |
149
|
|
|
|
|
|
|
|
150
|
|
|
|
|
|
|
mysql => { |
151
|
|
|
|
|
|
|
'socket' => $socket, |
152
|
|
|
|
|
|
|
'no-auto-rehash' => '', |
153
|
|
|
|
|
|
|
}, |
154
|
|
|
|
|
|
|
); |
155
|
|
|
|
|
|
|
} |
156
|
|
|
|
|
|
|
|
157
|
|
|
|
|
|
|
sub viable { |
158
|
6
|
|
|
6
|
1
|
11
|
my $this = shift; |
159
|
6
|
|
|
|
|
12
|
my ($spec) = @_; |
160
|
|
|
|
|
|
|
|
161
|
6
|
50
|
|
|
|
22
|
my %check = (ref($this) ? %$this : (), $this->_default_paths, %$spec); |
162
|
|
|
|
|
|
|
|
163
|
6
|
|
|
|
|
13
|
my @bad; |
164
|
|
|
|
|
|
|
|
165
|
6
|
50
|
33
|
|
|
35
|
push @bad => "Could not load either 'DBD::mysql' or 'DBD::MariaDB', needed for everything" |
166
|
|
|
|
|
|
|
unless $DBDMYSQL || $DBDMARIA; |
167
|
|
|
|
|
|
|
|
168
|
6
|
50
|
|
|
|
19
|
if ($spec->{bootstrap}) { |
|
|
0
|
|
|
|
|
|
169
|
6
|
50
|
33
|
|
|
30
|
push @bad => "'mysqld' command is missing, needed for bootstrap" unless $check{mysqld} && -x $check{mysqld}; |
170
|
|
|
|
|
|
|
} |
171
|
|
|
|
|
|
|
elsif ($spec->{autostart}) { |
172
|
0
|
0
|
0
|
|
|
0
|
push @bad => "'mysqld' command is missing, needed for autostart" unless $check{mysqld} && -x $check{mysqld}; |
173
|
|
|
|
|
|
|
} |
174
|
|
|
|
|
|
|
|
175
|
6
|
50
|
|
|
|
16
|
if ($spec->{load_sql}) { |
176
|
6
|
50
|
33
|
|
|
21
|
push @bad => "'mysql' command is missing, needed for load_sql" unless $check{mysql} && -x $check{mysql}; |
177
|
|
|
|
|
|
|
} |
178
|
|
|
|
|
|
|
|
179
|
6
|
50
|
33
|
|
|
26
|
if ($check{+MYSQLD} || $MYSQLD) { |
180
|
0
|
|
|
|
|
0
|
my $version = $this->version_string; |
181
|
0
|
0
|
0
|
|
|
0
|
if ($version && $version =~ m/(\d+)\.(\d+)\.(\d+)/) { |
182
|
0
|
|
|
|
|
0
|
my ($a, $b, $c) = ($1, $2, $3); |
183
|
0
|
0
|
0
|
|
|
0
|
push @bad => "'mysqld' is too old ($a.$b.$c), need at least 5.6.0" |
|
|
|
0
|
|
|
|
|
184
|
|
|
|
|
|
|
if $a < 5 || ($a == 5 && $b < 6); |
185
|
|
|
|
|
|
|
} |
186
|
|
|
|
|
|
|
} |
187
|
|
|
|
|
|
|
|
188
|
6
|
50
|
|
|
|
15
|
return (1, undef) unless @bad; |
189
|
6
|
|
|
|
|
36
|
return (0, join "\n" => @bad); |
190
|
|
|
|
|
|
|
} |
191
|
|
|
|
|
|
|
|
192
|
|
|
|
|
|
|
sub init { |
193
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
194
|
0
|
|
|
|
|
|
$self->SUPER::init(); |
195
|
|
|
|
|
|
|
|
196
|
|
|
|
|
|
|
# Percona is the more restrictive, so fallback to mariadb behavior for |
197
|
|
|
|
|
|
|
# now. Add patches for more variants if needed. |
198
|
0
|
0
|
|
|
|
|
unless ($self->{+MYSQLD_PROVIDER}) { |
199
|
0
|
0
|
|
|
|
|
if ($self->version_string =~ m/(mariadb|percona)/i) { |
200
|
0
|
|
|
|
|
|
$self->{+MYSQLD_PROVIDER} = lc($1); |
201
|
|
|
|
|
|
|
|
202
|
0
|
0
|
|
|
|
|
if ($self->{+MYSQLD_PROVIDER} eq 'percona') { |
203
|
0
|
|
0
|
|
|
|
my $binary = $self->{+MYSQLD} || $MYSQLD; |
204
|
0
|
|
|
|
|
|
my $help = `$binary --help --verbose 2>&1`; |
205
|
|
|
|
|
|
|
|
206
|
0
|
0
|
|
|
|
|
if ($help =~ m/--initialize/) { |
|
|
0
|
|
|
|
|
|
207
|
0
|
|
|
|
|
|
$self->{+USE_BOOTSTRAP} = 0; |
208
|
|
|
|
|
|
|
} |
209
|
|
|
|
|
|
|
elsif ($help =~ m/--bootstrap/) { |
210
|
0
|
|
|
|
|
|
$self->{+USE_BOOTSTRAP} = 1; |
211
|
|
|
|
|
|
|
|
212
|
0
|
0
|
|
|
|
|
$self->{+USE_INSTALLDB} = $INSTALLDB ? 1 : 0; |
213
|
|
|
|
|
|
|
} |
214
|
|
|
|
|
|
|
} |
215
|
|
|
|
|
|
|
} |
216
|
|
|
|
|
|
|
else { |
217
|
0
|
|
0
|
|
|
|
my $binary = $self->{+MYSQLD} || $MYSQLD; |
218
|
0
|
|
|
|
|
|
my $help = `$binary --help --verbose 2>&1`; |
219
|
|
|
|
|
|
|
|
220
|
0
|
0
|
|
|
|
|
if ($help =~ m/(mariadb|percona)/i) { |
|
|
0
|
|
|
|
|
|
|
|
0
|
|
|
|
|
|
221
|
0
|
|
|
|
|
|
$self->{+MYSQLD_PROVIDER} = lc($1); |
222
|
|
|
|
|
|
|
} |
223
|
|
|
|
|
|
|
elsif ($help =~ m/--bootstrap/) { |
224
|
0
|
|
|
|
|
|
$self->{+MYSQLD_PROVIDER} = 'mariadb'; |
225
|
|
|
|
|
|
|
} |
226
|
|
|
|
|
|
|
elsif ($help =~ m/--initialize/) { |
227
|
0
|
|
|
|
|
|
$self->{+MYSQLD_PROVIDER} = 'percona'; |
228
|
|
|
|
|
|
|
} |
229
|
|
|
|
|
|
|
} |
230
|
|
|
|
|
|
|
} |
231
|
|
|
|
|
|
|
|
232
|
|
|
|
|
|
|
confess "Could not determine mysqld provider (" . ($self->{+MYSQLD} || $MYSQLD) . ") please specify mysqld_prover => mariadb|percona" |
233
|
0
|
0
|
0
|
|
|
|
unless $self->{+MYSQLD_PROVIDER}; |
234
|
|
|
|
|
|
|
|
235
|
0
|
|
0
|
|
|
|
$self->{+DBD_DRIVER} //= $DBDMARIA || $DBDMYSQL; |
|
|
|
0
|
|
|
|
|
236
|
|
|
|
|
|
|
|
237
|
0
|
|
0
|
|
|
|
$self->{+CHARACTER_SET_SERVER} //= 'UTF8MB4'; |
238
|
|
|
|
|
|
|
|
239
|
0
|
|
|
|
|
|
$self->{+DATA_DIR} = $self->{+DIR} . '/data'; |
240
|
0
|
|
|
|
|
|
$self->{+TEMP_DIR} = $self->{+DIR} . '/temp'; |
241
|
0
|
|
|
|
|
|
$self->{+PID_FILE} = $self->{+DIR} . '/mysql.pid'; |
242
|
0
|
|
|
|
|
|
$self->{+CFG_FILE} = $self->{+DIR} . '/my.cfg'; |
243
|
|
|
|
|
|
|
|
244
|
0
|
|
0
|
|
|
|
$self->{+SOCKET} ||= $self->{+DIR} . '/mysql.sock'; |
245
|
|
|
|
|
|
|
|
246
|
0
|
|
0
|
|
|
|
$self->{+USERNAME} ||= 'root'; |
247
|
|
|
|
|
|
|
|
248
|
0
|
|
|
|
|
|
my %defaults = $self->_default_paths; |
249
|
0
|
|
0
|
|
|
|
$self->{$_} ||= $defaults{$_} for keys %defaults; |
250
|
|
|
|
|
|
|
|
251
|
0
|
|
|
|
|
|
my %cfg_defs = $self->_default_config; |
252
|
0
|
0
|
|
|
|
|
my $cfg = { %{$self->{+CONFIG} || {}} }; |
|
0
|
|
|
|
|
|
|
253
|
0
|
|
|
|
|
|
$self->{+CONFIG} = $cfg; |
254
|
|
|
|
|
|
|
|
255
|
0
|
|
|
|
|
|
for my $key (keys %cfg_defs) { |
256
|
0
|
0
|
|
|
|
|
if (defined $cfg->{$key}) { |
257
|
0
|
|
|
|
|
|
my $subdft = $cfg_defs{$key}; |
258
|
0
|
|
|
|
|
|
my $subcfg = { %{$cfg->{$key}} }; |
|
0
|
|
|
|
|
|
|
259
|
0
|
|
|
|
|
|
$cfg->{$key} = $subcfg; |
260
|
|
|
|
|
|
|
|
261
|
0
|
|
|
|
|
|
for my $skey (%$subdft) { |
262
|
0
|
0
|
|
|
|
|
next if defined $subcfg->{$skey}; |
263
|
0
|
|
|
|
|
|
$subcfg->{$skey} = $subdft->{$skey}; |
264
|
|
|
|
|
|
|
} |
265
|
|
|
|
|
|
|
} |
266
|
|
|
|
|
|
|
else { |
267
|
0
|
|
|
|
|
|
$cfg->{$key} = $cfg_defs{$key}; |
268
|
|
|
|
|
|
|
} |
269
|
|
|
|
|
|
|
} |
270
|
|
|
|
|
|
|
} |
271
|
|
|
|
|
|
|
|
272
|
|
|
|
|
|
|
sub clone_data { |
273
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
274
|
|
|
|
|
|
|
|
275
|
|
|
|
|
|
|
my $config = strip_hash_defaults( |
276
|
0
|
|
|
|
|
|
$self->{+CONFIG}, |
277
|
|
|
|
|
|
|
{ $self->_default_config }, |
278
|
|
|
|
|
|
|
); |
279
|
|
|
|
|
|
|
|
280
|
|
|
|
|
|
|
return ( |
281
|
|
|
|
|
|
|
$self->SUPER::clone_data(), |
282
|
|
|
|
|
|
|
|
283
|
|
|
|
|
|
|
CONFIG() => $config, |
284
|
|
|
|
|
|
|
MYSQLD() => $self->{+MYSQLD}, |
285
|
|
|
|
|
|
|
MYSQL() => $self->{+MYSQL}, |
286
|
|
|
|
|
|
|
DBD_DRIVER() => $self->{+DBD_DRIVER}, |
287
|
0
|
|
|
|
|
|
MYSQLD_PROVIDER() => $self->{+MYSQLD_PROVIDER}, |
288
|
|
|
|
|
|
|
); |
289
|
|
|
|
|
|
|
} |
290
|
|
|
|
|
|
|
|
291
|
|
|
|
|
|
|
sub write_config { |
292
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
293
|
0
|
|
|
|
|
|
my (%params) = @_; |
294
|
|
|
|
|
|
|
|
295
|
0
|
|
|
|
|
|
my $cfg_file = $self->{+CFG_FILE}; |
296
|
0
|
0
|
|
|
|
|
open(my $cfh, '>', $cfg_file) or die "Could not open config file: $!"; |
297
|
0
|
|
|
|
|
|
my $conf = $self->{+CONFIG}; |
298
|
0
|
|
|
|
|
|
for my $section (sort keys %$conf) { |
299
|
0
|
0
|
|
|
|
|
my $sconf = $conf->{$section} or next; |
300
|
|
|
|
|
|
|
|
301
|
0
|
0
|
|
|
|
|
$sconf = { %$sconf, %{$params{add}} } if $params{add}; |
|
0
|
|
|
|
|
|
|
302
|
|
|
|
|
|
|
|
303
|
0
|
|
|
|
|
|
print $cfh "[$section]\n"; |
304
|
0
|
|
|
|
|
|
for my $key (sort keys %$sconf) { |
305
|
0
|
|
|
|
|
|
my $val = $sconf->{$key}; |
306
|
0
|
0
|
|
|
|
|
next unless defined $val; |
307
|
|
|
|
|
|
|
|
308
|
0
|
0
|
0
|
|
|
|
next if $params{skip} && ($key =~ $params{skip} || $val =~ $params{skip}); |
|
|
|
0
|
|
|
|
|
309
|
|
|
|
|
|
|
|
310
|
0
|
0
|
|
|
|
|
if (length($val)) { |
311
|
0
|
|
|
|
|
|
print $cfh "$key = $val\n"; |
312
|
|
|
|
|
|
|
} |
313
|
|
|
|
|
|
|
else { |
314
|
0
|
|
|
|
|
|
print $cfh "$key\n"; |
315
|
|
|
|
|
|
|
} |
316
|
|
|
|
|
|
|
} |
317
|
|
|
|
|
|
|
|
318
|
0
|
|
|
|
|
|
print $cfh "\n"; |
319
|
|
|
|
|
|
|
} |
320
|
0
|
|
|
|
|
|
close($cfh); |
321
|
|
|
|
|
|
|
|
322
|
0
|
|
|
|
|
|
return; |
323
|
|
|
|
|
|
|
} |
324
|
|
|
|
|
|
|
|
325
|
|
|
|
|
|
|
sub bootstrap { |
326
|
0
|
|
|
0
|
|
|
my $self = shift; |
327
|
|
|
|
|
|
|
|
328
|
0
|
|
|
|
|
|
my $data_dir = $self->{+DATA_DIR}; |
329
|
0
|
|
|
|
|
|
my $temp_dir = $self->{+TEMP_DIR}; |
330
|
|
|
|
|
|
|
|
331
|
0
|
0
|
|
|
|
|
mkdir($data_dir) or die "Could not create data dir: $!"; |
332
|
0
|
0
|
|
|
|
|
mkdir($temp_dir) or die "Could not create temp dir: $!"; |
333
|
|
|
|
|
|
|
|
334
|
|
|
|
|
|
|
|
335
|
0
|
|
|
|
|
|
my $init_file = "$self->{+DIR}/init.sql"; |
336
|
0
|
0
|
|
|
|
|
open(my $init, '>', $init_file) or die "Could not open init file: $!"; |
337
|
0
|
|
|
|
|
|
print $init "CREATE DATABASE quickdb;\n"; |
338
|
0
|
|
|
|
|
|
close($init); |
339
|
|
|
|
|
|
|
|
340
|
0
|
|
|
|
|
|
my $provider = $self->{+MYSQLD_PROVIDER}; |
341
|
|
|
|
|
|
|
|
342
|
0
|
0
|
|
|
|
|
if ($provider eq 'percona') { |
343
|
|
|
|
|
|
|
|
344
|
0
|
0
|
|
|
|
|
if ($self->{+USE_BOOTSTRAP}) { |
345
|
0
|
0
|
|
|
|
|
if($self->{+USE_INSTALLDB}) { |
346
|
0
|
|
|
|
|
|
local $ENV{PERL5LIB} = ""; |
347
|
0
|
|
|
|
|
|
$self->run_command([$INSTALLDB, '--datadir=' . $data_dir]); |
348
|
|
|
|
|
|
|
} |
349
|
0
|
|
|
|
|
|
$self->write_config(); |
350
|
0
|
|
|
|
|
|
$self->run_command([$self->start_command, '--bootstrap'], {stdin => $init_file}); |
351
|
|
|
|
|
|
|
} |
352
|
|
|
|
|
|
|
else { |
353
|
0
|
|
|
|
|
|
$self->write_config(); |
354
|
0
|
|
|
|
|
|
$self->run_command([$self->start_command, '--initialize']); |
355
|
0
|
|
|
|
|
|
$self->start; |
356
|
0
|
|
|
|
|
|
$self->load_sql("", $init_file); |
357
|
|
|
|
|
|
|
} |
358
|
|
|
|
|
|
|
} |
359
|
|
|
|
|
|
|
else { |
360
|
|
|
|
|
|
|
# Bootstrap is much faster without InnoDB, we will turn InnoDB back on later, and things will use it. |
361
|
0
|
|
|
|
|
|
$self->write_config(skip => qr/innodb/i, add => {'default-storage-engine' => 'MyISAM'}); |
362
|
0
|
|
|
|
|
|
$self->run_command([$self->start_command, '--bootstrap'], {stdin => $init_file}); |
363
|
|
|
|
|
|
|
|
364
|
|
|
|
|
|
|
# Turn InnoDB back on |
365
|
0
|
|
|
|
|
|
$self->write_config(); |
366
|
|
|
|
|
|
|
} |
367
|
|
|
|
|
|
|
|
368
|
0
|
|
|
|
|
|
return; |
369
|
|
|
|
|
|
|
} |
370
|
|
|
|
|
|
|
|
371
|
|
|
|
|
|
|
sub load_sql { |
372
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
373
|
0
|
|
|
|
|
|
my ($db_name, $file) = @_; |
374
|
|
|
|
|
|
|
|
375
|
0
|
|
|
|
|
|
my $cfg_file = $self->{+CFG_FILE}; |
376
|
|
|
|
|
|
|
|
377
|
|
|
|
|
|
|
$self->run_command( |
378
|
|
|
|
|
|
|
[ |
379
|
0
|
|
|
|
|
|
$self->{+MYSQL}, |
380
|
|
|
|
|
|
|
"--defaults-file=$cfg_file", |
381
|
|
|
|
|
|
|
'-u' => 'root', |
382
|
|
|
|
|
|
|
$db_name, |
383
|
|
|
|
|
|
|
], |
384
|
|
|
|
|
|
|
{stdin => $file}, |
385
|
|
|
|
|
|
|
); |
386
|
|
|
|
|
|
|
} |
387
|
|
|
|
|
|
|
|
388
|
|
|
|
|
|
|
sub shell_command { |
389
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
390
|
0
|
|
|
|
|
|
my ($db_name) = @_; |
391
|
|
|
|
|
|
|
|
392
|
0
|
|
|
|
|
|
my $cfg_file = $self->{+CFG_FILE}; |
393
|
0
|
|
|
|
|
|
return ($self->{+MYSQL}, "--defaults-file=$cfg_file", $db_name); |
394
|
|
|
|
|
|
|
} |
395
|
|
|
|
|
|
|
|
396
|
|
|
|
|
|
|
sub start_command { |
397
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
398
|
|
|
|
|
|
|
|
399
|
0
|
|
|
|
|
|
my $cfg_file = $self->{+CFG_FILE}; |
400
|
0
|
|
|
|
|
|
return ($self->{+MYSQLD}, "--defaults-file=$cfg_file", '--skip-grant-tables'); |
401
|
|
|
|
|
|
|
} |
402
|
|
|
|
|
|
|
|
403
|
|
|
|
|
|
|
sub connect_string { |
404
|
0
|
|
|
0
|
1
|
|
my $self = shift; |
405
|
0
|
|
|
|
|
|
my ($db_name) = @_; |
406
|
0
|
0
|
|
|
|
|
$db_name = 'quickdb' unless defined $db_name; |
407
|
|
|
|
|
|
|
|
408
|
0
|
|
|
|
|
|
my $socket = $self->{+SOCKET}; |
409
|
|
|
|
|
|
|
|
410
|
0
|
0
|
|
|
|
|
if ($self->{+DBD_DRIVER} eq 'DBD::MariaDB') { |
411
|
0
|
|
|
|
|
|
return "dbi:MariaDB:dbname=$db_name;mariadb_socket=$socket"; |
412
|
|
|
|
|
|
|
} |
413
|
|
|
|
|
|
|
else { |
414
|
0
|
|
|
|
|
|
return "dbi:mysql:dbname=$db_name;mysql_socket=$socket"; |
415
|
|
|
|
|
|
|
} |
416
|
|
|
|
|
|
|
} |
417
|
|
|
|
|
|
|
|
418
|
|
|
|
|
|
|
1; |
419
|
|
|
|
|
|
|
|
420
|
|
|
|
|
|
|
__END__ |