61 lines
1.7 KiB
Python
61 lines
1.7 KiB
Python
# Copyright (C) 2016-present the asyncpg authors and contributors
|
|
# <see AUTHORS file>
|
|
#
|
|
# This module is part of asyncpg and is released under
|
|
# the Apache 2.0 License: http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
|
|
import re
|
|
|
|
from .types import ServerVersion
|
|
|
|
version_regex = re.compile(
|
|
r"(Postgre[^\s]*)?\s*"
|
|
r"(?P<major>[0-9]+)\.?"
|
|
r"((?P<minor>[0-9]+)\.?)?"
|
|
r"(?P<micro>[0-9]+)?"
|
|
r"(?P<releaselevel>[a-z]+)?"
|
|
r"(?P<serial>[0-9]+)?"
|
|
)
|
|
|
|
|
|
def split_server_version_string(version_string):
|
|
version_match = version_regex.search(version_string)
|
|
|
|
if version_match is None:
|
|
raise ValueError(
|
|
"Unable to parse Postgres "
|
|
f'version from "{version_string}"'
|
|
)
|
|
|
|
version = version_match.groupdict()
|
|
for ver_key, ver_value in version.items():
|
|
# Cast all possible versions parts to int
|
|
try:
|
|
version[ver_key] = int(ver_value)
|
|
except (TypeError, ValueError):
|
|
pass
|
|
|
|
if version.get("major") < 10:
|
|
return ServerVersion(
|
|
version.get("major"),
|
|
version.get("minor") or 0,
|
|
version.get("micro") or 0,
|
|
version.get("releaselevel") or "final",
|
|
version.get("serial") or 0,
|
|
)
|
|
|
|
# Since PostgreSQL 10 the versioning scheme has changed.
|
|
# 10.x really means 10.0.x. While parsing 10.1
|
|
# as (10, 1) may seem less confusing, in practice most
|
|
# version checks are written as version[:2], and we
|
|
# want to keep that behaviour consistent, i.e not fail
|
|
# a major version check due to a bugfix release.
|
|
return ServerVersion(
|
|
version.get("major"),
|
|
0,
|
|
version.get("minor") or 0,
|
|
version.get("releaselevel") or "final",
|
|
version.get("serial") or 0,
|
|
)
|