Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/skade

.nornir/flight-rest-catalog-design.md

skade-flight over an existing lake — any Iceberg catalog, read-only

Design (chosen path only). Power BI / ODBC / ADBC reach an EXISTING Iceberg lake — written by Spark, catalogued in Nessie, data on MinIO — through skade-flight, read-only, pure Rust. How the catalog is opened lives in skade: catalog-connectors-design.md.

f0 — the whole idea

skade-flight's SQL layer was already catalog-agnostic: IcebergCatalogProvider takes an Arc<dyn iceberg::Catalog>. Only the Engine held a skade Warehouse. So the engine now holds the catalog:

skade::connect::{SkadeLocal | SkadeObjectStore | NessieV2 | IcebergRest}
        │ CatalogConnector::open
        ▼
Arc<dyn Catalog> ─ Engine::with_catalog ─ Flight SQL ─ ODBC / ADBC ─ Power BI
piece where
Engine::with_catalog(Arc<dyn Catalog>, EngineOptions) skade-flight/src/engine.rs
EngineOptions.default_namespace (was hardcoded main; also GetPrimaryKeys' fallback) engine.rs, service.rs
EngineOptions.read_only → Error::ReadOnly (gRPC PERMISSION_DENIED) on the update door and session-view DDL engine.rs, error.rs

Engine::new / with_options / with_engine_options(Warehouse, …) are unchanged; they delegate with the warehouse's RedbCatalog (the warehouse is held, so its redb lock lives as long as the engine). Engine::warehouse() keeps its signature and panics (documented) on a with_catalog engine; try_warehouse() is the non-panicking form, catalog() the catalog.

Decisions

Proven by