<?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); } } |