<?php
declare(strict_types=1);
namespace MySQLReplication\Gtid;
use MySQLReplication\BinaryDataReader\BinaryDataReader;
class Gtid
{
private array $intervals = [];
private string $sid;
public function __construct(string $gtid)
{
if ((bool)preg_match(
'/^([0-9a-fA-F]{8}(?:-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12})((?::[0-9-]+)+)$/',
$gtid,
$matches
) === false) {
throw new GtidException(GtidException::INCORRECT_GTID_MESSAGE, GtidException::INCORRECT_GTID_CODE);
}
$this->sid = $matches[1];
foreach (array_filter(explode(':', $matches[2])) as $k) {
$this->intervals[] = explode('-', $k);
}
$this->sid = str_replace('-', '', $this->sid);
}
public function getEncoded(): string
{
$buffer = pack('H*', $this->sid);
$buffer .= BinaryDataReader::pack64bit(count($this->intervals));
foreach ($this->intervals as $interval) {
$buffer .= BinaryDataReader::pack64bit((int)$interval[0]);
if (count($interval) !== 1) {
$buffer .= BinaryDataReader::pack64bit((int)$interval[1]);
} else {
$buffer .= BinaryDataReader::pack64bit($interval[0] + 1);
}
}
return $buffer;
}
public function getEncodedLength(): int
{
return 40 * count($this->intervals);
}
}
|