engine.py held four unrelated things: what the tables are, how to open a connection, how to read a database's state, and the Store that coordinates writes. At 1240 lines the Store's own concerns — locks, migrations, vacuum, tags — were hard to find among them. Table records, Arrow schemas, index_specs, ensure_indexes, REQUIRED_TABLES and query_to_pydantic move to store/schema.py, which imports nothing from haiku.rag: it describes the tables and never opens or mutates one. gather_database_info, get_database_stats, DatabaseInfo and its result models move to store/info.py. Nothing in Store calls them — they are read paths for the CLI, doctor, inspector and ingester API — so info depends on engine and not the reverse. engine.py keeps the Store, ConnectionMode, connect_lancedb, the tag helpers and the restore-order and retention constants. No re-exports: importers point at the new modules. test_app_info_uses_connect_lancedb_for_remote patched haiku.rag.store.engine.connect_lancedb; gather_database_info now binds that name in info.py, so the patch targets where the call is looked up.
22 lines
949 B
Python
22 lines
949 B
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
|
|
from haiku.rag.ingester.api.server import APIState, get_state
|
|
from haiku.rag.store.info import DatabaseInfo, gather_database_info
|
|
|
|
router = APIRouter(tags=["database"])
|
|
|
|
|
|
@router.get("/database", response_model=DatabaseInfo)
|
|
async def database(state: APIState = Depends(get_state)) -> DatabaseInfo:
|
|
"""Read-only snapshot of the LanceDB target — stored version, embeddings,
|
|
per-table counts/sizes, vector index status, pending migrations and
|
|
package versions. The same data the `haiku-rag info` command prints.
|
|
|
|
Opens a fresh read-only connection per call; not cached and not part of
|
|
the dashboard's polling loop."""
|
|
if state.db_path is None:
|
|
raise HTTPException(
|
|
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
|
|
detail="database path not configured",
|
|
)
|
|
return await gather_database_info(state.config, state.db_path)
|