core/lib/mysql_version.py (96 lines of code) (raw):

#!/usr/bin/env python3 """ Copyright (c) 2017-present, Facebook, Inc. All rights reserved. This source code is licensed under the BSD-style license found in the LICENSE file in the root directory of this source tree. """ FB_FORK_NAME = "fb" class MySQLVersion(object): def __init__(self, version_str): self._version_str = version_str self._version = "" self._fork = "" self._build = "" self.parse_str() def parse_str(self): segments = self._version_str.split("-") self._version = segments[0] # It's possible for a version string to have no fork and build segment if len(segments) > 1: self._fork = segments[1] if len(segments) > 2: self._build = segments[2] @property def major(self): """ Major version is the first segment of a version string """ return int(self._version.split(".")[0]) @property def minor(self): """ Minor version is the seconds segment of a version string """ return int(self._version.split(".")[1]) @property def release(self): """ Release is the third segment of a version string """ return int(self._version.split(".")[2]) @property def build(self): """ If there's a build information it will be the last part the version string """ return self._build @property def fork(self): """ If the running MySQL is not a community version, it will have something after the general version string separated by dash """ return self._fork @property def is_fb(self): """ Return if current running MySQL is a Facebook fork """ return self.fork == FB_FORK_NAME @property def is_mysql8(self): """ Return if current running MySQL is msyql8 """ return self.major == 8 def __gt__(self, other): if self.major > other.major: return True elif self.major == other.major: if self.minor > other.minor: return True elif self.minor == other.minor: if self.release > other.release: return True else: return False else: return False else: return False def __lt__(self, other): if self.major < other.major: return True elif self.major == other.major: if self.minor < other.minor: return True elif self.minor == other.minor: if self.release < other.release: return True else: return False else: return False else: return False def __ge__(self, other): if self.major > other.major: return True elif self.major == other.major: if self.minor > other.minor: return True elif self.minor == other.minor: if self.release >= other.release: return True else: return False else: return False else: return False def __le__(self, other): if self.major < other.major: return True elif self.major == other.major: if self.minor < other.minor: return True elif self.minor == other.minor: if self.release <= other.release: return True else: return False else: return False else: return False