* Initial orjson support take 2 Still need to work out problem building wheels -- Redux of #72754 / #32153 Now possible since the following is solved: ijl/orjson#220 (comment) This implements orjson where we use our default encoder. This does not implement orjson where `ExtendedJSONEncoder` is used as these areas tend to be called far less frequently. If its desired, this could be done in a followup, but it seemed like a case of diminishing returns (except maybe for large diagnostics files, or traces, but those are not expected to be downloaded frequently). Areas where this makes a perceptible difference: - Anything that subscribes to entities (Initial subscribe_entities payload) - Initial download of registries on first connection / restore - History queries - Saving states to the database - Large logbook queries - Anything that subscribes to events (appdaemon) Cavets: orjson supports serializing dataclasses natively (and much faster) which eliminates the need to implement `as_dict` in many places when the data is already in a dataclass. This works well as long as all the data in the dataclass can also be serialized. I audited all places where we have an `as_dict` for a dataclass and found only backups needs to be adjusted (support for `Path` needed to be added for backups). I was a little bit worried about `SensorExtraStoredData` with `Decimal` but it all seems to work out from since it converts it before it gets to the json encoding cc @dgomes If it turns out to be a problem we can disable this with option |= [orjson.OPT_PASSTHROUGH_DATACLASS](https://github.com/ijl/orjson#opt_passthrough_dataclass) and it will fallback to `as_dict` Its quite impressive for history queries <img width="1271" alt="Screen_Shot_2022-05-30_at_23_46_30" src="https://user-images.githubusercontent.com/663432/171145699-661ad9db-d91d-4b2d-9c1a-9d7866c03a73.png"> * use for views as well * handle UnicodeEncodeError * tweak * DRY * DRY * not needed * fix tests * Update tests/components/http/test_view.py * Update tests/components/http/test_view.py * black * templates
45 lines
1.2 KiB
Python
45 lines
1.2 KiB
Python
"""Recorder constants."""
|
|
|
|
from homeassistant.backports.enum import StrEnum
|
|
from homeassistant.const import ATTR_ATTRIBUTION, ATTR_RESTORED, ATTR_SUPPORTED_FEATURES
|
|
from homeassistant.helpers.json import ( # noqa: F401 pylint: disable=unused-import
|
|
JSON_DUMP,
|
|
)
|
|
|
|
DATA_INSTANCE = "recorder_instance"
|
|
SQLITE_URL_PREFIX = "sqlite://"
|
|
MYSQLDB_URL_PREFIX = "mysql://"
|
|
DOMAIN = "recorder"
|
|
|
|
CONF_DB_INTEGRITY_CHECK = "db_integrity_check"
|
|
|
|
MAX_QUEUE_BACKLOG = 40000
|
|
|
|
# The maximum number of rows (events) we purge in one delete statement
|
|
|
|
# sqlite3 has a limit of 999 until version 3.32.0
|
|
# in https://github.com/sqlite/sqlite/commit/efdba1a8b3c6c967e7fae9c1989c40d420ce64cc
|
|
# We can increase this back to 1000 once most
|
|
# have upgraded their sqlite version
|
|
MAX_ROWS_TO_PURGE = 998
|
|
|
|
DB_WORKER_PREFIX = "DbWorker"
|
|
|
|
ALL_DOMAIN_EXCLUDE_ATTRS = {ATTR_ATTRIBUTION, ATTR_RESTORED, ATTR_SUPPORTED_FEATURES}
|
|
|
|
ATTR_KEEP_DAYS = "keep_days"
|
|
ATTR_REPACK = "repack"
|
|
ATTR_APPLY_FILTER = "apply_filter"
|
|
|
|
KEEPALIVE_TIME = 30
|
|
|
|
|
|
EXCLUDE_ATTRIBUTES = f"{DOMAIN}_exclude_attributes_by_domain"
|
|
|
|
|
|
class SupportedDialect(StrEnum):
|
|
"""Supported dialects."""
|
|
|
|
SQLITE = "sqlite"
|
|
MYSQL = "mysql"
|
|
POSTGRESQL = "postgresql"
|