Passed
Pull Request — master (#38)
by kacper
05:27
created

BinLogServerInfo::getVersion()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 3
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
nc 1
nop 0
dl 0
loc 3
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace MySQLReplication\BinLog;
4
5
/**
6
 * Class BinLogServerInfo
7
 * @package MySQLReplication\BinLog
8
 */
9
class BinLogServerInfo
10
{
11
    const MYSQL_VERSION_MARIADB = 'MariaDB';
12
    const MYSQL_VERSION_PERCONA = 'Percona';
13
    const MYSQL_VERSION_GENERIC = 'MySQL';
14
    /**
15
     * @var array
16
     */
17
    private static $serverInfo = [];
18
19
    /**
20
     * @param string $data
21
     * @param string $version
22
     */
23 55
    public static function parsePackage($data, $version)
24
    {
25 55
        $i = 0;
26 55
        $length = strlen($data);
27 55
        self::$serverInfo['protocol_version'] = ord($data[$i]);
28 55
        $i++;
29
30
        //version
31 55
        self::$serverInfo['server_version'] = '';
32 55
        $start = $i;
33 55
        for ($i = $start; $i < $length; $i++) {
34 55
            if ($data[$i] === chr(0)) {
35 55
                $i++;
36 55
                break;
37
            }
38 55
            self::$serverInfo['server_version'] .= $data[$i];
39 55
        }
40
41
        //connection_id 4 bytes
42 55
        self::$serverInfo['connection_id'] = unpack('I', $data[$i] . $data[++$i] . $data[++$i] . $data[++$i])[1];
43 55
        $i++;
44
45
        //auth_plugin_data_part_1
46
        //[len=8] first 8 bytes of the auth-plugin data
47 55
        self::$serverInfo['salt'] = '';
48 55
        for ($j = $i; $j < $i + 8; $j++) {
49 55
            self::$serverInfo['salt'] .= $data[$j];
50 55
        }
51 55
        $i += 8;
52
53
        //filler_1 (1) -- 0x00
54 55
        $i++;
55
56
        //capability_flag_1 (2) -- lower 2 bytes of the Protocol::CapabilityFlags (optional)
57 55
        $i += 2;
58
59
        //character_set (1) -- default server character-set, only the lower 8-bits Protocol::CharacterSet (optional)
60 55
        self::$serverInfo['character_set'] = $data[$i];
61 55
        $i++;
62
63
        //status_flags (2) -- Protocol::StatusFlags (optional)
64 55
        $i += 2;
65
66
        //capability_flags_2 (2) -- upper 2 bytes of the Protocol::CapabilityFlags
67 55
        $i += 2;
68
69
        //auth_plugin_data_len (1) -- length of the combined auth_plugin_data, if auth_plugin_data_len is > 0
70 55
        $salt_len = ord($data[$i]);
71 55
        $i++;
72
73 55
        $salt_len = max(12, $salt_len - 9);
74
75 55
        $i += 10;
76
77
        //next salt
78 55
        if ($length >= $i + $salt_len) {
79 55
            for ($j = $i; $j < $i + $salt_len; $j++) {
80 55
                self::$serverInfo['salt'] .= $data[$j];
81 55
            }
82
83 55
        }
84 55
        self::$serverInfo['auth_plugin_name'] = '';
85 55
        $i += $salt_len + 1;
86 55
        for ($j = $i; $j < $length - 1; $j++) {
87 55
            self::$serverInfo['auth_plugin_name'] .= $data[$j];
88 55
        }
89
90 55
        self::$serverInfo['version_name'] = self::parseVersion($version);
91 55
    }
92
93
    /**
94
     * @return string
95
     */
96 55
    public static function getSalt()
97
    {
98 55
        return self::$serverInfo['salt'];
99
    }
100
101
    /**
102
     * @see http://stackoverflow.com/questions/37317869/determine-if-mysql-or-percona-or-mariadb
103
     * @param string $version
104
     * @return string
105
     */
106 55
    private static function parseVersion($version)
107
    {
108 55
        if ('' !== $version) {
109 55
            if (false !== strpos($version, self::MYSQL_VERSION_MARIADB)) {
110
                return self::MYSQL_VERSION_MARIADB;
111
            }
112 55
            if (false !== strpos($version, self::MYSQL_VERSION_PERCONA)) {
113
                return self::MYSQL_VERSION_PERCONA;
114
            }
115 55
        }
116
117 55
        return self::MYSQL_VERSION_GENERIC;
118
    }
119
120
    /**
121
     * @return string
122
     */
123 55
    public static function getVersion()
124
    {
125 55
        return self::$serverInfo['version_name'];
126
    }
127
128
    /**
129
     * @return bool
130
     */
131 55
    public static function isMariaDb()
132
    {
133 55
        return self::MYSQL_VERSION_MARIADB === self::getVersion();
134
    }
135
136
    /**
137
     * @return bool
138
     */
139
    public static function isPercona()
140
    {
141
        return self::MYSQL_VERSION_PERCONA === self::getVersion();
142
    }
143
144
    /**
145
     * @return bool
146
     */
147
    public static function isGeneric()
148
    {
149
        return self::MYSQL_VERSION_GENERIC === self::getVersion();
150
    }
151
}