diff --git a/libraries/classes/Controllers/Server/BinlogController.php b/libraries/classes/Controllers/Server/BinlogController.php index ae29440a3f..8b86dafbc1 100644 --- a/libraries/classes/Controllers/Server/BinlogController.php +++ b/libraries/classes/Controllers/Server/BinlogController.php @@ -35,10 +35,7 @@ class BinlogController extends AbstractController parent::__construct($response, $template); $this->dbi = $dbi; - $this->binaryLogs = $this->dbi->fetchResult( - 'SHOW MASTER LOGS', - 'Log_name' - ); + $this->binaryLogs = $this->dbi->fetchResult('SHOW BINARY LOGS', 'Log_name'); } public function __invoke(): void diff --git a/libraries/classes/Menu.php b/libraries/classes/Menu.php index 17d89b05ce..e4b07971fa 100644 --- a/libraries/classes/Menu.php +++ b/libraries/classes/Menu.php @@ -466,10 +466,7 @@ class Menu if (SessionCache::has('binary_logs')) { $binaryLogs = SessionCache::get('binary_logs'); } else { - $binaryLogs = $this->dbi->fetchResult( - 'SHOW MASTER LOGS', - 'Log_name' - ); + $binaryLogs = $this->dbi->fetchResult('SHOW BINARY LOGS', 'Log_name'); SessionCache::set('binary_logs', $binaryLogs); } diff --git a/libraries/classes/Query/Compatibility.php b/libraries/classes/Query/Compatibility.php index d81040f0e8..82ae1b4088 100644 --- a/libraries/classes/Query/Compatibility.php +++ b/libraries/classes/Query/Compatibility.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace PhpMyAdmin\Query; use PhpMyAdmin\DatabaseInterface; +use PhpMyAdmin\Dbal\DbalInterface; use PhpMyAdmin\Util; use function in_array; @@ -254,4 +255,18 @@ class Compatibility { return $isMariaDb && $version >= 100402 || ! $isMariaDb && $version >= 50706; } + + /** @return non-empty-string */ + public static function getShowBinLogStatusStmt(DbalInterface $dbal): string + { + if ($dbal->isMySql() && $dbal->getVersion() >= 80200) { + return 'SHOW BINARY LOG STATUS'; + } + + if ($dbal->isMariaDB() && $dbal->getVersion() >= 100502) { + return 'SHOW BINLOG STATUS'; + } + + return 'SHOW MASTER STATUS'; + } } diff --git a/libraries/classes/Replication.php b/libraries/classes/Replication.php index 4822332fe7..acd9f3c0b8 100644 --- a/libraries/classes/Replication.php +++ b/libraries/classes/Replication.php @@ -8,6 +8,7 @@ declare(strict_types=1); namespace PhpMyAdmin; use PhpMyAdmin\Dbal\ResultInterface; +use PhpMyAdmin\Query\Compatibility; use function explode; use function mb_strtoupper; @@ -62,7 +63,7 @@ class Replication return -1; } - if ($dbi->isMySql() && $dbi->getVersion() >= 80400) { + if ($dbi->isMySql() && $dbi->getVersion() >= 80022 || $dbi->isMariaDB() && $dbi->getVersion() >= 100501) { return $dbi->tryQuery($action . ' REPLICA ' . $control . ';', $link); } @@ -99,7 +100,7 @@ class Replication $this->replicaControl('STOP', null, $link); } - if ($dbi->isMySql() && $dbi->getVersion() >= 80400) { + if ($dbi->isMySql() && $dbi->getVersion() >= 80023) { $out = $dbi->tryQuery( 'CHANGE REPLICATION SOURCE TO ' . 'SOURCE_HOST=\'' . $host . '\',' . @@ -175,11 +176,7 @@ class Replication { global $dbi; - if ($dbi->isMySql() && $dbi->getVersion() >= 80400) { - $data = $dbi->fetchResult('SHOW BINARY LOG STATUS', null, null, $link); - } else { - $data = $dbi->fetchResult('SHOW MASTER STATUS', null, null, $link); - } + $data = $dbi->fetchResult(Compatibility::getShowBinLogStatusStmt($dbi), null, null, $link); $output = []; diff --git a/libraries/classes/ReplicationGui.php b/libraries/classes/ReplicationGui.php index 528116dc78..a2a68ada76 100644 --- a/libraries/classes/ReplicationGui.php +++ b/libraries/classes/ReplicationGui.php @@ -76,8 +76,10 @@ class ReplicationGui if (! isset($_POST['repl_clear_scr'])) { $primaryStatusTable = $this->getHtmlForReplicationStatusTable('primary', true, false); - if ($dbi->isMySql() && $dbi->getVersion() >= 80400) { + if ($dbi->isMySql() && $dbi->getVersion() >= 80022) { $replicas = $dbi->fetchResult('SHOW REPLICAS', null, null); + } elseif ($dbi->isMariaDB() && $dbi->getVersion() >= 100501) { + $replicas = $dbi->fetchResult('SHOW REPLICA HOSTS', null, null); } else { $replicas = $dbi->fetchResult('SHOW SLAVE HOSTS', null, null); } @@ -130,9 +132,10 @@ class ReplicationGui ): string { global $dbi; - if ($dbi->isMySql() && $dbi->getVersion() >= 80400) { + $serverReplicaMultiReplication = []; + if ($dbi->isMariaDB() && $dbi->getVersion() >= 100501) { $serverReplicaMultiReplication = $dbi->fetchResult('SHOW ALL REPLICAS STATUS'); - } else { + } elseif ($dbi->isMariaDB()) { $serverReplicaMultiReplication = $dbi->fetchResult('SHOW ALL SLAVES STATUS'); } @@ -590,7 +593,7 @@ class ReplicationGui if ($_POST['sr_replica_action'] === 'reset') { $qStop = $this->replication->replicaControl('STOP', null, DatabaseInterface::CONNECT_USER); - if ($dbi->isMySql() && $dbi->getVersion() >= 80400) { + if ($dbi->isMySql() && $dbi->getVersion() >= 80022 || $dbi->isMariaDB() && $dbi->getVersion() >= 100501) { $qReset = $dbi->tryQuery('RESET REPLICA;'); } else { $qReset = $dbi->tryQuery('RESET SLAVE;'); diff --git a/libraries/classes/ReplicationInfo.php b/libraries/classes/ReplicationInfo.php index 689cf1e188..707a8ad1eb 100644 --- a/libraries/classes/ReplicationInfo.php +++ b/libraries/classes/ReplicationInfo.php @@ -4,6 +4,8 @@ declare(strict_types=1); namespace PhpMyAdmin; +use PhpMyAdmin\Query\Compatibility; + use function count; use function explode; use function sprintf; @@ -117,11 +119,7 @@ final class ReplicationInfo private function setPrimaryStatus(): void { - if ($this->dbi->isMySql() && $this->dbi->getVersion() >= 80400) { - $this->primaryStatus = $this->dbi->fetchResult('SHOW BINARY LOG STATUS'); - } else { - $this->primaryStatus = $this->dbi->fetchResult('SHOW MASTER STATUS'); - } + $this->primaryStatus = $this->dbi->fetchResult(Compatibility::getShowBinLogStatusStmt($this->dbi)); } public function getPrimaryStatus(): array @@ -131,7 +129,10 @@ final class ReplicationInfo private function setReplicaStatus(): void { - if ($this->dbi->isMySql() && $this->dbi->getVersion() >= 80400) { + if ( + $this->dbi->isMySql() && $this->dbi->getVersion() >= 80022 + || $this->dbi->isMariaDB() && $this->dbi->getVersion() >= 100501 + ) { $this->replicaStatus = $this->dbi->fetchResult('SHOW REPLICA STATUS'); } else { $this->replicaStatus = $this->dbi->fetchResult('SHOW SLAVE STATUS'); @@ -145,9 +146,10 @@ final class ReplicationInfo private function setMultiPrimaryStatus(): void { - if ($this->dbi->isMySql() && $this->dbi->getVersion() >= 80400) { + $this->multiPrimaryStatus = []; + if ($this->dbi->isMariaDB() && $this->dbi->getVersion() >= 100501) { $this->multiPrimaryStatus = $this->dbi->fetchResult('SHOW ALL REPLICAS STATUS'); - } else { + } elseif ($this->dbi->isMariaDB()) { $this->multiPrimaryStatus = $this->dbi->fetchResult('SHOW ALL SLAVES STATUS'); } } diff --git a/test/classes/Query/CompatibilityTest.php b/test/classes/Query/CompatibilityTest.php index d851e61662..1f056b12c1 100644 --- a/test/classes/Query/CompatibilityTest.php +++ b/test/classes/Query/CompatibilityTest.php @@ -5,6 +5,7 @@ declare(strict_types=1); namespace PhpMyAdmin\Tests\Query; use PhpMyAdmin\DatabaseInterface; +use PhpMyAdmin\Dbal\DbalInterface; use PhpMyAdmin\Query\Compatibility; use PHPUnit\Framework\TestCase; @@ -63,4 +64,24 @@ class CompatibilityTest extends TestCase 'MariaDB 10.7.0' => [true, true, 100700], ]; } + + /** @dataProvider showBinLogStatusProvider */ + public function testGetShowBinLogStatusStmt(string $serverName, int $version, string $expected): void + { + $dbal = self::createStub(DbalInterface::class); + $dbal->method('isMySql')->willReturn($serverName === 'MySQL'); + $dbal->method('isMariaDB')->willReturn($serverName === 'MariaDB'); + $dbal->method('getVersion')->willReturn($version); + self::assertSame($expected, Compatibility::getShowBinLogStatusStmt($dbal)); + } + + /** @return iterable */ + public static function showBinLogStatusProvider(): iterable + { + yield ['MySQL', 80200, 'SHOW BINARY LOG STATUS']; + yield ['MariaDB', 100502, 'SHOW BINLOG STATUS']; + yield ['MySQL', 80199, 'SHOW MASTER STATUS']; + yield ['MariaDB', 100501, 'SHOW MASTER STATUS']; + yield ['MySQL', 100502, 'SHOW BINARY LOG STATUS']; + } } diff --git a/test/classes/Stubs/DbiDummy.php b/test/classes/Stubs/DbiDummy.php index b3f397fec5..e47b70b04b 100644 --- a/test/classes/Stubs/DbiDummy.php +++ b/test/classes/Stubs/DbiDummy.php @@ -603,7 +603,7 @@ class DbiDummy implements DbiExtension 'result' => [['1']], ], [ - 'query' => 'SHOW MASTER LOGS', + 'query' => 'SHOW BINARY LOGS', 'result' => [ [ 'Log_name' => 'index1',