1- """Canonical provider registry (Plan B) .
1+ """Canonical provider registry.
22
33This module is the single source of truth for:
44- supported provider ids (db_type)
88
99from __future__ import annotations
1010
11+ from collections .abc import Iterable
1112from dataclasses import dataclass
12- from importlib import import_module
1313from typing import TYPE_CHECKING
1414
15+ # Pre-import all schemas (no external dependencies)
16+ from .schema import (
17+ COCKROACHDB_SCHEMA ,
18+ D1_SCHEMA ,
19+ DUCKDB_SCHEMA ,
20+ MARIADB_SCHEMA ,
21+ MSSQL_SCHEMA ,
22+ MYSQL_SCHEMA ,
23+ ORACLE_SCHEMA ,
24+ POSTGRESQL_SCHEMA ,
25+ SQLITE_SCHEMA ,
26+ SUPABASE_SCHEMA ,
27+ TURSO_SCHEMA ,
28+ ConnectionSchema ,
29+ )
30+
31+ # Pre-import all adapter classes (they lazy-load their dependencies internally)
32+ from .adapters .cockroachdb import CockroachDBAdapter
33+ from .adapters .d1 import D1Adapter
34+ from .adapters .duckdb import DuckDBAdapter
35+ from .adapters .mariadb import MariaDBAdapter
36+ from .adapters .mssql import SQLServerAdapter
37+ from .adapters .mysql import MySQLAdapter
38+ from .adapters .oracle import OracleAdapter
39+ from .adapters .postgresql import PostgreSQLAdapter
40+ from .adapters .sqlite import SQLiteAdapter
41+ from .adapters .supabase import SupabaseAdapter
42+ from .adapters .turso import TursoAdapter
43+
1544if TYPE_CHECKING :
16- from collections .abc import Iterable
1745 from .adapters .base import DatabaseAdapter
18- from .schema import ConnectionSchema
1946
2047
2148@dataclass (frozen = True )
2249class ProviderSpec :
23- schema_path : tuple [ str , str ]
24- adapter_path : tuple [ str , str ]
50+ schema : ConnectionSchema
51+ adapter_class : type [ "DatabaseAdapter" ]
2552
2653
2754PROVIDERS : dict [str , ProviderSpec ] = {
28- "mssql" : ProviderSpec (
29- schema_path = ("sqlit.db.schema" , "MSSQL_SCHEMA" ),
30- adapter_path = ("sqlit.db.adapters.mssql" , "SQLServerAdapter" ),
31- ),
32- "sqlite" : ProviderSpec (
33- schema_path = ("sqlit.db.schema" , "SQLITE_SCHEMA" ),
34- adapter_path = ("sqlit.db.adapters.sqlite" , "SQLiteAdapter" ),
35- ),
36- "postgresql" : ProviderSpec (
37- schema_path = ("sqlit.db.schema" , "POSTGRESQL_SCHEMA" ),
38- adapter_path = ("sqlit.db.adapters.postgresql" , "PostgreSQLAdapter" ),
39- ),
40- "mysql" : ProviderSpec (
41- schema_path = ("sqlit.db.schema" , "MYSQL_SCHEMA" ),
42- adapter_path = ("sqlit.db.adapters.mysql" , "MySQLAdapter" ),
43- ),
44- "oracle" : ProviderSpec (
45- schema_path = ("sqlit.db.schema" , "ORACLE_SCHEMA" ),
46- adapter_path = ("sqlit.db.adapters.oracle" , "OracleAdapter" ),
47- ),
48- "mariadb" : ProviderSpec (
49- schema_path = ("sqlit.db.schema" , "MARIADB_SCHEMA" ),
50- adapter_path = ("sqlit.db.adapters.mariadb" , "MariaDBAdapter" ),
51- ),
52- "duckdb" : ProviderSpec (
53- schema_path = ("sqlit.db.schema" , "DUCKDB_SCHEMA" ),
54- adapter_path = ("sqlit.db.adapters.duckdb" , "DuckDBAdapter" ),
55- ),
56- "cockroachdb" : ProviderSpec (
57- schema_path = ("sqlit.db.schema" , "COCKROACHDB_SCHEMA" ),
58- adapter_path = ("sqlit.db.adapters.cockroachdb" , "CockroachDBAdapter" ),
59- ),
60- "turso" : ProviderSpec (
61- schema_path = ("sqlit.db.schema" , "TURSO_SCHEMA" ),
62- adapter_path = ("sqlit.db.adapters.turso" , "TursoAdapter" ),
63- ),
64- "supabase" : ProviderSpec (
65- schema_path = ("sqlit.db.schema" , "SUPABASE_SCHEMA" ),
66- adapter_path = ("sqlit.db.adapters.supabase" , "SupabaseAdapter" ),
67- ),
68- "d1" : ProviderSpec (
69- schema_path = ("sqlit.db.schema" , "D1_SCHEMA" ),
70- adapter_path = ("sqlit.db.adapters.d1" , "D1Adapter" ),
71- ),
55+ "mssql" : ProviderSpec (schema = MSSQL_SCHEMA , adapter_class = SQLServerAdapter ),
56+ "sqlite" : ProviderSpec (schema = SQLITE_SCHEMA , adapter_class = SQLiteAdapter ),
57+ "postgresql" : ProviderSpec (schema = POSTGRESQL_SCHEMA , adapter_class = PostgreSQLAdapter ),
58+ "mysql" : ProviderSpec (schema = MYSQL_SCHEMA , adapter_class = MySQLAdapter ),
59+ "oracle" : ProviderSpec (schema = ORACLE_SCHEMA , adapter_class = OracleAdapter ),
60+ "mariadb" : ProviderSpec (schema = MARIADB_SCHEMA , adapter_class = MariaDBAdapter ),
61+ "duckdb" : ProviderSpec (schema = DUCKDB_SCHEMA , adapter_class = DuckDBAdapter ),
62+ "cockroachdb" : ProviderSpec (schema = COCKROACHDB_SCHEMA , adapter_class = CockroachDBAdapter ),
63+ "turso" : ProviderSpec (schema = TURSO_SCHEMA , adapter_class = TursoAdapter ),
64+ "supabase" : ProviderSpec (schema = SUPABASE_SCHEMA , adapter_class = SupabaseAdapter ),
65+ "d1" : ProviderSpec (schema = D1_SCHEMA , adapter_class = D1Adapter ),
7266}
7367
7468
@@ -77,7 +71,7 @@ def get_supported_db_types() -> list[str]:
7771
7872
7973def iter_provider_schemas () -> Iterable [ConnectionSchema ]:
80- return (_get_schema ( spec ) for spec in PROVIDERS .values ())
74+ return (spec . schema for spec in PROVIDERS .values ())
8175
8276
8377def get_provider_spec (db_type : str ) -> ProviderSpec :
@@ -87,18 +81,12 @@ def get_provider_spec(db_type: str) -> ProviderSpec:
8781 return spec
8882
8983
90- def _get_schema (spec : ProviderSpec ) -> ConnectionSchema :
91- module_name , attr_name = spec .schema_path
92- module = import_module (module_name )
93- return getattr (module , attr_name )
94-
95-
9684def get_connection_schema (db_type : str ) -> ConnectionSchema :
97- return _get_schema ( get_provider_spec (db_type ))
85+ return get_provider_spec (db_type ). schema
9886
9987
10088def get_all_schemas () -> dict [str , ConnectionSchema ]:
101- return {k : _get_schema ( v ) for k , v in PROVIDERS .items ()}
89+ return {k : v . schema for k , v in PROVIDERS .items ()}
10290
10391
10492def get_adapter (db_type : str ) -> "DatabaseAdapter" :
@@ -109,35 +97,31 @@ def get_adapter(db_type: str) -> "DatabaseAdapter":
10997
11098
11199def get_adapter_class (db_type : str ) -> type ["DatabaseAdapter" ]:
112- spec = get_provider_spec (db_type )
113- module_name , class_name = spec .adapter_path
114- module = import_module (module_name )
115- adapter_cls = getattr (module , class_name )
116- return adapter_cls
100+ return get_provider_spec (db_type ).adapter_class
117101
118102
119103def get_default_port (db_type : str ) -> str :
120104 spec = PROVIDERS .get (db_type )
121105 if spec is None :
122106 return "1433"
123- return _get_schema ( spec ) .default_port
107+ return spec . schema .default_port
124108
125109
126110def get_display_name (db_type : str ) -> str :
127111 spec = PROVIDERS .get (db_type )
128- return _get_schema ( spec ) .display_name if spec else db_type
112+ return spec . schema .display_name if spec else db_type
129113
130114
131115def supports_ssh (db_type : str ) -> bool :
132116 spec = PROVIDERS .get (db_type )
133- return _get_schema ( spec ) .supports_ssh if spec else False
117+ return spec . schema .supports_ssh if spec else False
134118
135119
136120def is_file_based (db_type : str ) -> bool :
137121 spec = PROVIDERS .get (db_type )
138- return _get_schema ( spec ) .is_file_based if spec else False
122+ return spec . schema .is_file_based if spec else False
139123
140124
141125def has_advanced_auth (db_type : str ) -> bool :
142126 spec = PROVIDERS .get (db_type )
143- return _get_schema ( spec ) .has_advanced_auth if spec else False
127+ return spec . schema .has_advanced_auth if spec else False
0 commit comments