diff --git a/lib/Pingback.pm b/lib/Pingback.pm index 6d8c15de..e40607f9 100644 --- a/lib/Pingback.pm +++ b/lib/Pingback.pm @@ -307,10 +307,31 @@ sub _generate_identifier { my $dbh = $instance->{dbh}; my $dsn = $instance->{dsn}; - my $sql = q{SELECT CONCAT(@@hostname, @@port)}; + # MySQL 5.1+ has @@hostname and @@port + # MySQL 5.0 has @@hostname but port only in SHOW VARS + # MySQL 4.x has nothing, so we use the dsn + my $sql = q{SELECT CONCAT(@@hostname, @@port)}; + PTDEBUG && _d($sql); my ($name) = eval { $dbh->selectrow_array($sql) }; - if ( $EVAL_ERROR ) { # assume that it's MySQL 4.x - $name = ($dsn->{h} || 'localhost') . ($dsn->{P} || 3306); + if ( $EVAL_ERROR ) { + # MySQL 4.x or 5.0 + PTDEBUG && _d($EVAL_ERROR); + $sql = q{SELECT @@hostname}; + PTDEBUG && _d($sql); + ($name) = eval { $dbh->selectrow_array($sql) }; + if ( $EVAL_ERROR ) { + # MySQL 4.x + PTDEBUG && _d($EVAL_ERROR); + $name = ($dsn->{h} || 'localhost') . ($dsn->{P} || 3306); + } + else { + # MySQL 5.0 + $sql = q{SHOW VARIABLES LIKE 'port'}; + PTDEBUG && _d($sql); + my (undef, $port) = eval { $dbh->selectrow_array($sql) }; + PTDEBUG && _d('port:', $port); + $name .= $port || ''; + } } my $id = md5_hex($name); diff --git a/t/lib/Pingback.t b/t/lib/Pingback.t index d5058774..87dde73f 100644 --- a/t/lib/Pingback.t +++ b/t/lib/Pingback.t @@ -35,11 +35,10 @@ if ( $master_dbh ) { (undef, $mysql_distro) = $master_dbh->selectrow_array("SHOW VARIABLES LIKE 'version_comment'"); - my $sql = q{SELECT CONCAT(@@hostname, @@port)}; - my ($name) = $master_dbh->selectrow_array($sql); - $master_id = md5_hex($name); - - (undef, $slave1_id) = Pingback::_generate_identifier( { dbh => $slave1_dbh } ); + (undef, $master_id) = Pingback::_generate_identifier( + { dbh => $master_dbh, dsn => { h => '127.1', P => 12345 }}); + (undef, $slave1_id) = Pingback::_generate_identifier( + { dbh => $slave1_dbh, dsn => { h => '127.1', P => 12346 }}); $master_inst = { id => $master_id, @@ -283,12 +282,28 @@ is( SKIP: { skip 'Cannot connect to sandbox master', 2 unless $master_dbh; - skip 'Requires MySQL 5.0.38 or newer', unless $sandbox_version ge '5.0.38'; + my $expect_master_id; + if ( $sandbox_version ge '5.1' ) { + my $sql = q{SELECT CONCAT(@@hostname, @@port)}; + my ($name) = $master_dbh->selectrow_array($sql); + $expect_master_id = md5_hex($name); + } + elsif ( $sandbox_version eq '5.0' ) { + my $sql = q{SELECT @@hostname}; + my ($hostname) = $master_dbh->selectrow_array($sql); + $sql = q{SHOW VARIABLES LIKE 'port'}; + my (undef, $port) = $master_dbh->selectrow_array($sql); + $expect_master_id = md5_hex($hostname . $port); + } + else { + $expect_master_id = md5_hex("localhost", 12345); + } + is( - Pingback::_generate_identifier( { dbh => $master_dbh, dsn => undef } ), $master_id, - "_generate_identifier() works with a dbh" + $expect_master_id, + "_generate_identifier() for MySQL $sandbox_version" ); # The time limit file already exists (see previous tests), but this is