192 lines
4.8 KiB
PHP
192 lines
4.8 KiB
PHP
|
<?php
|
||
|
|
||
|
declare(strict_types=1);
|
||
|
|
||
|
namespace PhpMyAdmin;
|
||
|
|
||
|
use function count;
|
||
|
use function explode;
|
||
|
use function sprintf;
|
||
|
|
||
|
final class ReplicationInfo
|
||
|
{
|
||
|
/** @var string[] */
|
||
|
public $primaryVariables = [
|
||
|
'File',
|
||
|
'Position',
|
||
|
'Binlog_Do_DB',
|
||
|
'Binlog_Ignore_DB',
|
||
|
];
|
||
|
|
||
|
/** @var string[] */
|
||
|
public $replicaVariables = [
|
||
|
'Slave_IO_State',
|
||
|
'Master_Host',
|
||
|
'Master_User',
|
||
|
'Master_Port',
|
||
|
'Connect_Retry',
|
||
|
'Master_Log_File',
|
||
|
'Read_Master_Log_Pos',
|
||
|
'Relay_Log_File',
|
||
|
'Relay_Log_Pos',
|
||
|
'Relay_Master_Log_File',
|
||
|
'Slave_IO_Running',
|
||
|
'Slave_SQL_Running',
|
||
|
'Replicate_Do_DB',
|
||
|
'Replicate_Ignore_DB',
|
||
|
'Replicate_Do_Table',
|
||
|
'Replicate_Ignore_Table',
|
||
|
'Replicate_Wild_Do_Table',
|
||
|
'Replicate_Wild_Ignore_Table',
|
||
|
'Last_Errno',
|
||
|
'Last_Error',
|
||
|
'Skip_Counter',
|
||
|
'Exec_Master_Log_Pos',
|
||
|
'Relay_Log_Space',
|
||
|
'Until_Condition',
|
||
|
'Until_Log_File',
|
||
|
'Until_Log_Pos',
|
||
|
'Master_SSL_Allowed',
|
||
|
'Master_SSL_CA_File',
|
||
|
'Master_SSL_CA_Path',
|
||
|
'Master_SSL_Cert',
|
||
|
'Master_SSL_Cipher',
|
||
|
'Master_SSL_Key',
|
||
|
'Seconds_Behind_Master',
|
||
|
];
|
||
|
|
||
|
/** @var array */
|
||
|
private $primaryStatus = [];
|
||
|
|
||
|
/** @var array */
|
||
|
private $replicaStatus = [];
|
||
|
|
||
|
/** @var array */
|
||
|
private $multiPrimaryStatus = [];
|
||
|
|
||
|
/** @var array */
|
||
|
private $primaryInfo = [];
|
||
|
|
||
|
/** @var array */
|
||
|
private $replicaInfo = [];
|
||
|
|
||
|
/** @var DatabaseInterface */
|
||
|
private $dbi;
|
||
|
|
||
|
public function __construct(DatabaseInterface $dbi)
|
||
|
{
|
||
|
$this->dbi = $dbi;
|
||
|
}
|
||
|
|
||
|
public function load(?string $connection = null): void
|
||
|
{
|
||
|
global $urlParams;
|
||
|
|
||
|
$this->setPrimaryStatus();
|
||
|
|
||
|
if (! empty($connection)) {
|
||
|
$this->setMultiPrimaryStatus();
|
||
|
|
||
|
if ($this->multiPrimaryStatus) {
|
||
|
$this->setDefaultPrimaryConnection($connection);
|
||
|
$urlParams['primary_connection'] = $connection;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
$this->setReplicaStatus();
|
||
|
$this->setPrimaryInfo();
|
||
|
$this->setReplicaInfo();
|
||
|
}
|
||
|
|
||
|
private function setPrimaryStatus(): void
|
||
|
{
|
||
|
$this->primaryStatus = $this->dbi->fetchResult('SHOW MASTER STATUS');
|
||
|
}
|
||
|
|
||
|
public function getPrimaryStatus(): array
|
||
|
{
|
||
|
return $this->primaryStatus;
|
||
|
}
|
||
|
|
||
|
private function setReplicaStatus(): void
|
||
|
{
|
||
|
$this->replicaStatus = $this->dbi->fetchResult('SHOW SLAVE STATUS');
|
||
|
}
|
||
|
|
||
|
public function getReplicaStatus(): array
|
||
|
{
|
||
|
return $this->replicaStatus;
|
||
|
}
|
||
|
|
||
|
private function setMultiPrimaryStatus(): void
|
||
|
{
|
||
|
$this->multiPrimaryStatus = $this->dbi->fetchResult('SHOW ALL SLAVES STATUS');
|
||
|
}
|
||
|
|
||
|
private function setDefaultPrimaryConnection(string $connection): void
|
||
|
{
|
||
|
$this->dbi->query(sprintf('SET @@default_master_connection = \'%s\'', $this->dbi->escapeString($connection)));
|
||
|
}
|
||
|
|
||
|
private static function fill(array $status, string $key): array
|
||
|
{
|
||
|
if (empty($status[0][$key])) {
|
||
|
return [];
|
||
|
}
|
||
|
|
||
|
return explode(',', $status[0][$key]);
|
||
|
}
|
||
|
|
||
|
private function setPrimaryInfo(): void
|
||
|
{
|
||
|
$this->primaryInfo = ['status' => false];
|
||
|
|
||
|
if (count($this->primaryStatus) > 0) {
|
||
|
$this->primaryInfo['status'] = true;
|
||
|
}
|
||
|
|
||
|
if (! $this->primaryInfo['status']) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->primaryInfo['Do_DB'] = self::fill($this->primaryStatus, 'Binlog_Do_DB');
|
||
|
$this->primaryInfo['Ignore_DB'] = self::fill($this->primaryStatus, 'Binlog_Ignore_DB');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getPrimaryInfo(): array
|
||
|
{
|
||
|
return $this->primaryInfo;
|
||
|
}
|
||
|
|
||
|
private function setReplicaInfo(): void
|
||
|
{
|
||
|
$this->replicaInfo = ['status' => false];
|
||
|
|
||
|
if (count($this->replicaStatus) > 0) {
|
||
|
$this->replicaInfo['status'] = true;
|
||
|
}
|
||
|
|
||
|
if (! $this->replicaInfo['status']) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
$this->replicaInfo['Do_DB'] = self::fill($this->replicaStatus, 'Replicate_Do_DB');
|
||
|
$this->replicaInfo['Ignore_DB'] = self::fill($this->replicaStatus, 'Replicate_Ignore_DB');
|
||
|
$this->replicaInfo['Do_Table'] = self::fill($this->replicaStatus, 'Replicate_Do_Table');
|
||
|
$this->replicaInfo['Ignore_Table'] = self::fill($this->replicaStatus, 'Replicate_Ignore_Table');
|
||
|
$this->replicaInfo['Wild_Do_Table'] = self::fill($this->replicaStatus, 'Replicate_Wild_Do_Table');
|
||
|
$this->replicaInfo['Wild_Ignore_Table'] = self::fill($this->replicaStatus, 'Replicate_Wild_Ignore_Table');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getReplicaInfo(): array
|
||
|
{
|
||
|
return $this->replicaInfo;
|
||
|
}
|
||
|
}
|