Warn that the minimum SQLite version will change to 3.40.1 as of 2025.2 (#104298)

Co-authored-by: Robert Resch <robert@resch.dev>
This commit is contained in:
J. Nick Koston 2024-07-31 08:13:04 -05:00 committed by GitHub
parent cddb3bb668
commit a35fa0e95a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 132 additions and 20 deletions

View file

@ -96,6 +96,7 @@ MARIADB_WITH_FIXED_IN_QUERIES_108 = _simple_version("10.8.4")
MIN_VERSION_MYSQL = _simple_version("8.0.0")
MIN_VERSION_PGSQL = _simple_version("12.0")
MIN_VERSION_SQLITE = _simple_version("3.31.0")
UPCOMING_MIN_VERSION_SQLITE = _simple_version("3.40.1")
MIN_VERSION_SQLITE_MODERN_BIND_VARS = _simple_version("3.32.0")
@ -356,7 +357,7 @@ def _fail_unsupported_dialect(dialect_name: str) -> NoReturn:
raise UnsupportedDialect
def _fail_unsupported_version(
def _raise_if_version_unsupported(
server_version: str, dialect_name: str, minimum_version: str
) -> NoReturn:
"""Warn about unsupported database version."""
@ -373,16 +374,54 @@ def _fail_unsupported_version(
raise UnsupportedDialect
@callback
def _async_delete_issue_deprecated_version(
hass: HomeAssistant, dialect_name: str
) -> None:
"""Delete the issue about upcoming unsupported database version."""
ir.async_delete_issue(hass, DOMAIN, f"{dialect_name}_too_old")
@callback
def _async_create_issue_deprecated_version(
hass: HomeAssistant,
server_version: AwesomeVersion,
dialect_name: str,
min_version: AwesomeVersion,
) -> None:
"""Warn about upcoming unsupported database version."""
ir.async_create_issue(
hass,
DOMAIN,
f"{dialect_name}_too_old",
is_fixable=False,
severity=ir.IssueSeverity.CRITICAL,
translation_key=f"{dialect_name}_too_old",
translation_placeholders={
"server_version": str(server_version),
"min_version": str(min_version),
},
breaks_in_ha_version="2025.2.0",
)
def _extract_version_from_server_response_or_raise(
server_response: str,
) -> AwesomeVersion:
"""Extract version from server response."""
return AwesomeVersion(
server_response,
ensure_strategy=AwesomeVersionStrategy.SIMPLEVER,
find_first_match=True,
)
def _extract_version_from_server_response(
server_response: str,
) -> AwesomeVersion | None:
"""Attempt to extract version from server response."""
try:
return AwesomeVersion(
server_response,
ensure_strategy=AwesomeVersionStrategy.SIMPLEVER,
find_first_match=True,
)
return _extract_version_from_server_response_or_raise(server_response)
except AwesomeVersionException:
return None
@ -475,13 +514,27 @@ def setup_connection_for_dialect(
# as its persistent and isn't free to call every time.
result = query_on_connection(dbapi_connection, "SELECT sqlite_version()")
version_string = result[0][0]
version = _extract_version_from_server_response(version_string)
version = _extract_version_from_server_response_or_raise(version_string)
if not version or version < MIN_VERSION_SQLITE:
_fail_unsupported_version(
if version < MIN_VERSION_SQLITE:
_raise_if_version_unsupported(
version or version_string, "SQLite", MIN_VERSION_SQLITE
)
# No elif here since _raise_if_version_unsupported raises
if version < UPCOMING_MIN_VERSION_SQLITE:
instance.hass.add_job(
_async_create_issue_deprecated_version,
instance.hass,
version or version_string,
dialect_name,
UPCOMING_MIN_VERSION_SQLITE,
)
else:
instance.hass.add_job(
_async_delete_issue_deprecated_version, instance.hass, dialect_name
)
if version and version > MIN_VERSION_SQLITE_MODERN_BIND_VARS:
max_bind_vars = SQLITE_MODERN_MAX_BIND_VARS
@ -513,7 +566,7 @@ def setup_connection_for_dialect(
if is_maria_db:
if not version or version < MIN_VERSION_MARIA_DB:
_fail_unsupported_version(
_raise_if_version_unsupported(
version or version_string, "MariaDB", MIN_VERSION_MARIA_DB
)
if version and (
@ -529,7 +582,7 @@ def setup_connection_for_dialect(
)
elif not version or version < MIN_VERSION_MYSQL:
_fail_unsupported_version(
_raise_if_version_unsupported(
version or version_string, "MySQL", MIN_VERSION_MYSQL
)
@ -551,7 +604,7 @@ def setup_connection_for_dialect(
version_string = result[0][0]
version = _extract_version_from_server_response(version_string)
if not version or version < MIN_VERSION_PGSQL:
_fail_unsupported_version(
_raise_if_version_unsupported(
version or version_string, "PostgreSQL", MIN_VERSION_PGSQL
)