fix: read-only analytics DB ATTACHes extract.duckdb files for view resolution
This commit is contained in:
parent
a0f7e98f11
commit
6efdf4ca64
1 changed files with 16 additions and 3 deletions
19
src/db.py
19
src/db.py
|
|
@ -213,16 +213,29 @@ def get_analytics_db() -> duckdb.DuckDBPyConnection:
|
||||||
|
|
||||||
|
|
||||||
def get_analytics_db_readonly() -> duckdb.DuckDBPyConnection:
|
def get_analytics_db_readonly() -> duckdb.DuckDBPyConnection:
|
||||||
"""Read-only connection to analytics DB. Blocks writes and external access."""
|
"""Read-only connection to analytics DB. Blocks writes and external access.
|
||||||
|
|
||||||
|
ATTACHes extract.duckdb files so views that reference them work.
|
||||||
|
"""
|
||||||
db_path = _get_data_dir() / "analytics" / "server.duckdb"
|
db_path = _get_data_dir() / "analytics" / "server.duckdb"
|
||||||
if not db_path.exists():
|
if not db_path.exists():
|
||||||
db_path.parent.mkdir(parents=True, exist_ok=True)
|
db_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
return duckdb.connect(str(db_path), read_only=False) # Can't open read-only if new
|
return duckdb.connect(str(db_path), read_only=False)
|
||||||
conn = duckdb.connect(str(db_path), read_only=True)
|
conn = duckdb.connect(str(db_path), read_only=True)
|
||||||
try:
|
try:
|
||||||
conn.execute("SET enable_external_access = false")
|
conn.execute("SET enable_external_access = false")
|
||||||
except Exception:
|
except Exception:
|
||||||
pass # Older DuckDB may not support this
|
pass
|
||||||
|
# ATTACH extract.duckdb files so views referencing them work
|
||||||
|
extracts_dir = _get_data_dir() / "extracts"
|
||||||
|
if extracts_dir.exists():
|
||||||
|
for ext_dir in sorted(extracts_dir.iterdir()):
|
||||||
|
db_file = ext_dir / "extract.duckdb"
|
||||||
|
if db_file.exists() and ext_dir.is_dir():
|
||||||
|
try:
|
||||||
|
conn.execute(f"ATTACH '{db_file}' AS {ext_dir.name} (READ_ONLY)")
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
return conn
|
return conn
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue