from dataclasses import dataclass from urllib.parse import urlparse from config import get_value @dataclass(frozen=True) class TDengineConfig: url: str = "" username: str = "" password: str = "" database: str = "" stable: str = "drilling_realtime_st" device_code: str = "GJ-304-0088" pool_size: int = 2 timeout: int = 10 @property def enabled(self): return bool(self.base_url and self.database and self.username) @property def base_url(self): base_url, _ = parse_taos_url(self.url) return base_url def parse_taos_url(jdbc_url): if not jdbc_url: return "", "" raw = str(jdbc_url).strip() if raw.lower().startswith("jdbc:taos-rs://"): raw = "http://" + raw[len("jdbc:TAOS-RS://") :] elif "://" not in raw: raw = "http://" + raw parsed = urlparse(raw) base_url = f"{parsed.scheme or 'http'}://{parsed.hostname or '127.0.0.1'}:{parsed.port or 6041}" database = (parsed.path or "").strip("/") return base_url, database def _resolve_raw_config(cfg_or_app): raw = getattr(cfg_or_app, "raw", None) return raw if isinstance(raw, dict) else cfg_or_app def load_tdengine_config(cfg_or_app, default_device_code="GJ-304-0088"): cfg = _resolve_raw_config(cfg_or_app) url = get_value(cfg, ("tdengine", "url"), ("tdengine-url",), default="") _, database_from_url = parse_taos_url(url) return TDengineConfig( url=url, username=get_value(cfg, ("tdengine", "username"), ("tdengine-username",), default=""), password=get_value(cfg, ("tdengine", "password"), ("tdengine-password",), default=""), database=get_value(cfg, ("tdengine", "database"), ("tdengine-database",), default=database_from_url), stable=get_value(cfg, ("tdengine", "stable"), ("tdengine-stable",), default="drilling_realtime_st"), device_code=get_value( cfg, ("tdengine", "device-code"), ("tdengine", "equipment-sn"), default=default_device_code, ), pool_size=int(get_value(cfg, ("tdengine", "pool-size"), ("tdengine-pool-size",), default=2)), timeout=int(get_value(cfg, ("tdengine", "timeout"), ("tdengine-timeout",), default=10)), )