Bug #27694: mysqlhotcopy & p5-DBD-mysql51-4.003
Use "SHOW TABLES FROM `db`" instead of $dbh->tables() in the get_list_of_tables() routine. The symptom is that, when used with recent versions of DBD::mysql, mysqlhotcopy uses a double-qualified table name, for example: Invalid db.table name 'test.test`.`x' at /usr/bin/mysqlhotcopy line 855. This is caused by a change in DBD::mysql. See this diff: http://svn.perl.org/viewcvs/modules/DBD-mysql/trunk/lib/DBD/mysql.pm?r1=9183&r2=9188 Basically, older DBD::mysql implemented a limited ->table_info method; now the full method is implemented, and as a result DBI's ->tables() method has access to the schema value, so it uses it.
This commit is contained in:
parent
7812c2d38a
commit
dcd94251d4
@ -821,30 +821,14 @@ sub get_raid_dirs {
|
||||
sub get_list_of_tables {
|
||||
my ( $db ) = @_;
|
||||
|
||||
# "use database" cannot cope with database names containing spaces
|
||||
# so create a new connection
|
||||
my $tables =
|
||||
eval {
|
||||
$dbh->selectall_arrayref('SHOW TABLES FROM ' .
|
||||
$dbh->quote_identifier($db))
|
||||
} || [];
|
||||
warn "Unable to retrieve list of tables in $db: $@" if $@;
|
||||
|
||||
my $dbh = DBI->connect("dbi:mysql:${db}${dsn};mysql_read_default_group=mysqlhotcopy",
|
||||
$opt{user}, $opt{password},
|
||||
{
|
||||
RaiseError => 1,
|
||||
PrintError => 0,
|
||||
AutoCommit => 1,
|
||||
});
|
||||
|
||||
my @dbh_tables = eval { $dbh->tables() };
|
||||
|
||||
## Remove quotes around table names
|
||||
my $quote = $dbh->get_info(29); # SQL_IDENTIFIER_QUOTE_CHAR
|
||||
if ($quote) {
|
||||
foreach (@dbh_tables) {
|
||||
s/^$quote(.*)$quote$/$1/;
|
||||
s/$quote$quote/$quote/g;
|
||||
}
|
||||
}
|
||||
|
||||
$dbh->disconnect();
|
||||
return @dbh_tables;
|
||||
return (map { $_->[0] } @$tables);
|
||||
}
|
||||
|
||||
sub quote_names {
|
||||
|
Loading…
x
Reference in New Issue
Block a user