Commit dcd94251 authored by tsmith@ramayana.hindu.god's avatar tsmith@ramayana.hindu.god
Browse files

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.
parent 7812c2d3
Loading
Loading
Loading
Loading
+8 −24
Original line number Diff line number Diff line
@@ -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 $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;
      }
    }
    my $tables =
        eval {
            $dbh->selectall_arrayref('SHOW TABLES FROM ' .
                                     $dbh->quote_identifier($db))
        } || [];
    warn "Unable to retrieve list of tables in $db: $@" if $@;

    $dbh->disconnect();
    return @dbh_tables;
    return (map { $_->[0] } @$tables);
}

sub quote_names {