sqlspec 0.47.0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
- sqlspec/__init__.py +167 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_typing.py +714 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +13 -0
- sqlspec/adapters/adbc/_typing.py +106 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1280 -0
- sqlspec/adapters/adbc/config.py +378 -0
- sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/core.py +922 -0
- sqlspec/adapters/adbc/data_dictionary.py +339 -0
- sqlspec/adapters/adbc/driver.py +534 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +534 -0
- sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/type_converter.py +142 -0
- sqlspec/adapters/aiomysql/__init__.py +21 -0
- sqlspec/adapters/aiomysql/_typing.py +137 -0
- sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
- sqlspec/adapters/aiomysql/adk/store.py +678 -0
- sqlspec/adapters/aiomysql/config.py +305 -0
- sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiomysql/core.py +536 -0
- sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
- sqlspec/adapters/aiomysql/driver.py +386 -0
- sqlspec/adapters/aiomysql/events/__init__.py +5 -0
- sqlspec/adapters/aiomysql/events/store.py +104 -0
- sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
- sqlspec/adapters/aiomysql/litestar/store.py +314 -0
- sqlspec/adapters/aiosqlite/__init__.py +26 -0
- sqlspec/adapters/aiosqlite/_typing.py +109 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +829 -0
- sqlspec/adapters/aiosqlite/config.py +315 -0
- sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
- sqlspec/adapters/aiosqlite/driver.py +311 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/pool.py +734 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +113 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +644 -0
- sqlspec/adapters/asyncmy/config.py +307 -0
- sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncmy/core.py +538 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
- sqlspec/adapters/asyncmy/driver.py +391 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +26 -0
- sqlspec/adapters/asyncpg/_typing.py +103 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +483 -0
- sqlspec/adapters/asyncpg/config.py +575 -0
- sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncpg/core.py +480 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/_hub.py +181 -0
- sqlspec/adapters/asyncpg/events/backend.py +210 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +15 -0
- sqlspec/adapters/bigquery/_typing.py +108 -0
- sqlspec/adapters/bigquery/config.py +362 -0
- sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/core.py +768 -0
- sqlspec/adapters/bigquery/data_dictionary.py +120 -0
- sqlspec/adapters/bigquery/driver.py +542 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
- sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +142 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +39 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
- sqlspec/adapters/cockroach_psycopg/config.py +511 -0
- sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +273 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +327 -0
- sqlspec/adapters/duckdb/__init__.py +29 -0
- sqlspec/adapters/duckdb/_typing.py +104 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +935 -0
- sqlspec/adapters/duckdb/config.py +386 -0
- sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/core.py +332 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +426 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/pool.py +350 -0
- sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mysqlconnector/__init__.py +39 -0
- sqlspec/adapters/mysqlconnector/_typing.py +186 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
- sqlspec/adapters/mysqlconnector/config.py +421 -0
- sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/mysqlconnector/core.py +472 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
- sqlspec/adapters/mysqlconnector/driver.py +516 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +39 -0
- sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_json_handlers.py +196 -0
- sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_param_types.py +46 -0
- sqlspec/adapters/oracledb/_typing.py +258 -0
- sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
- sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
- sqlspec/adapters/oracledb/adk/__init__.py +21 -0
- sqlspec/adapters/oracledb/adk/store.py +2453 -0
- sqlspec/adapters/oracledb/config.py +575 -0
- sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/core.py +820 -0
- sqlspec/adapters/oracledb/data_dictionary.py +404 -0
- sqlspec/adapters/oracledb/driver.py +1277 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/_hub.py +345 -0
- sqlspec/adapters/oracledb/events/backend.py +300 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +539 -0
- sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +18 -0
- sqlspec/adapters/psqlpy/_typing.py +121 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +591 -0
- sqlspec/adapters/psqlpy/config.py +376 -0
- sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/core.py +694 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
- sqlspec/adapters/psqlpy/driver.py +411 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/_hub.py +204 -0
- sqlspec/adapters/psqlpy/events/backend.py +210 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +38 -0
- sqlspec/adapters/psycopg/_typing.py +218 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1106 -0
- sqlspec/adapters/psycopg/config.py +695 -0
- sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/core.py +520 -0
- sqlspec/adapters/psycopg/data_dictionary.py +278 -0
- sqlspec/adapters/psycopg/driver.py +1033 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/_hub.py +388 -0
- sqlspec/adapters/psycopg/events/backend.py +398 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +554 -0
- sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +92 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +657 -0
- sqlspec/adapters/pymysql/config.py +176 -0
- sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/core.py +469 -0
- sqlspec/adapters/pymysql/data_dictionary.py +120 -0
- sqlspec/adapters/pymysql/driver.py +271 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/pool.py +184 -0
- sqlspec/adapters/spanner/__init__.py +33 -0
- sqlspec/adapters/spanner/_typing.py +102 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +758 -0
- sqlspec/adapters/spanner/config.py +355 -0
- sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/core.py +263 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/driver.py +407 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/type_converter.py +342 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +123 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +992 -0
- sqlspec/adapters/sqlite/config.py +240 -0
- sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/core.py +357 -0
- sqlspec/adapters/sqlite/data_dictionary.py +198 -0
- sqlspec/adapters/sqlite/driver.py +527 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/pool.py +237 -0
- sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +832 -0
- sqlspec/builder/__init__.py +181 -0
- sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_base.py +1071 -0
- sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_ddl.py +1691 -0
- sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_dml.py +386 -0
- sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_factory.py +1884 -0
- sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_insert.py +405 -0
- sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_join.py +489 -0
- sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_merge.py +823 -0
- sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_parsing_utils.py +295 -0
- sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_select.py +1666 -0
- sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_temporal.py +167 -0
- sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_vector_distance.py +330 -0
- sqlspec/cli.py +1095 -0
- sqlspec/config.py +2383 -0
- sqlspec/core/__init__.py +372 -0
- sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/_pagination.py +42 -0
- sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_pool.py +76 -0
- sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
- sqlspec/core/cache.py +1085 -0
- sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
- sqlspec/core/compiler.py +1090 -0
- sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/core/config_runtime.py +174 -0
- sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
- sqlspec/core/filters.py +969 -0
- sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
- sqlspec/core/hashing.py +266 -0
- sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +72 -0
- sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_alignment.py +283 -0
- sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_converter.py +554 -0
- sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_processor.py +1182 -0
- sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_transformers.py +324 -0
- sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_types.py +536 -0
- sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_validator.py +171 -0
- sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/core/pipeline.py +333 -0
- sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/query_modifiers.py +508 -0
- sqlspec/core/result/__init__.py +25 -0
- sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_base.py +1232 -0
- sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/splitter.py +1021 -0
- sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/sqlcommenter.py +249 -0
- sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
- sqlspec/core/statement.py +1865 -0
- sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/type_converter.py +340 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_loader.py +138 -0
- sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +81 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
- sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +53 -0
- sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +197 -0
- sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +69 -0
- sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +59 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/dialects/__init__.py +22 -0
- sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/_compat.py +14 -0
- sqlspec/dialects/postgres/__init__.py +9 -0
- sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_generators.py +57 -0
- sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_operators.py +81 -0
- sqlspec/dialects/postgres/_paradedb.py +50 -0
- sqlspec/dialects/postgres/_pgvector.py +36 -0
- sqlspec/dialects/spanner/__init__.py +6 -0
- sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/spanner/_generators.py +206 -0
- sqlspec/dialects/spanner/_spangres.py +77 -0
- sqlspec/dialects/spanner/_spanner.py +179 -0
- sqlspec/driver/__init__.py +49 -0
- sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_async.py +1830 -0
- sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_common.py +2292 -0
- sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_exception_handler.py +108 -0
- sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_query_cache.py +96 -0
- sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sql_helpers.py +139 -0
- sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_storage_helpers.py +153 -0
- sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sync.py +1817 -0
- sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
- sqlspec/exceptions.py +480 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +84 -0
- sqlspec/extensions/adk/_config_utils.py +199 -0
- sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/_types.py +41 -0
- sqlspec/extensions/adk/artifact/__init__.py +57 -0
- sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/artifact/_types.py +32 -0
- sqlspec/extensions/adk/artifact/service.py +508 -0
- sqlspec/extensions/adk/artifact/store.py +361 -0
- sqlspec/extensions/adk/converters.py +212 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +225 -0
- sqlspec/extensions/adk/memory/service.py +316 -0
- sqlspec/extensions/adk/memory/store.py +525 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +279 -0
- sqlspec/extensions/adk/store.py +590 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +462 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +22 -0
- sqlspec/extensions/fastapi/extension.py +391 -0
- sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/fastapi/providers.py +712 -0
- sqlspec/extensions/flask/__init__.py +38 -0
- sqlspec/extensions/flask/_state.py +87 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +539 -0
- sqlspec/extensions/litestar/__init__.py +31 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +1066 -0
- sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/litestar/providers.py +784 -0
- sqlspec/extensions/litestar/store.py +298 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/sanic/__init__.py +19 -0
- sqlspec/extensions/sanic/_state.py +43 -0
- sqlspec/extensions/sanic/_utils.py +127 -0
- sqlspec/extensions/sanic/extension.py +647 -0
- sqlspec/extensions/starlette/__init__.py +22 -0
- sqlspec/extensions/starlette/_state.py +42 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +374 -0
- sqlspec/extensions/starlette/middleware.py +281 -0
- sqlspec/loader.cp314-win_amd64.pyd +0 -0
- sqlspec/loader.py +727 -0
- sqlspec/migrations/__init__.py +39 -0
- sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/base.py +862 -0
- sqlspec/migrations/commands.py +2151 -0
- sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/runner.py +1195 -0
- sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/squash.py +490 -0
- sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/tracker.py +792 -0
- sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/validation.py +359 -0
- sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +57 -0
- sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_config.py +364 -0
- sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_dispatcher.py +200 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_observer.py +361 -0
- sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_runtime.py +461 -0
- sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +955 -0
- sqlspec/py.typed +0 -0
- sqlspec/service.py +433 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_arrow_payload.py +68 -0
- sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/_paths.py +58 -0
- sqlspec/storage/_utils.py +46 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/backends/base.py +374 -0
- sqlspec/storage/backends/fsspec.py +574 -0
- sqlspec/storage/backends/local.py +468 -0
- sqlspec/storage/backends/obstore.py +956 -0
- sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/errors.py +102 -0
- sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/pipeline.py +628 -0
- sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/registry.py +329 -0
- sqlspec/typing.py +405 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +384 -0
- sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/config_tools.py +314 -0
- sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/deprecation.py +157 -0
- sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/dispatch.py +101 -0
- sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/fixtures.py +260 -0
- sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/logging.py +251 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/portal.py +377 -0
- sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/schema.py +1040 -0
- sqlspec/utils/serializers/__init__.py +30 -0
- sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_json.py +415 -0
- sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_numpy.py +65 -0
- sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_schema.py +285 -0
- sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/sync_tools.py +316 -0
- sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/text.py +109 -0
- sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_converters.py +216 -0
- sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_guards.py +1508 -0
- sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/uuids.py +241 -0
- sqlspec-0.47.0.dist-info/METADATA +202 -0
- sqlspec-0.47.0.dist-info/RECORD +621 -0
- sqlspec-0.47.0.dist-info/WHEEL +4 -0
- sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
- sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
"""CockroachDB AsyncPG configuration."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any, ClassVar, TypedDict, cast
|
|
4
|
+
|
|
5
|
+
from asyncpg import create_pool as asyncpg_create_pool
|
|
6
|
+
from typing_extensions import NotRequired
|
|
7
|
+
|
|
8
|
+
from sqlspec.adapters.asyncpg.core import (
|
|
9
|
+
apply_driver_features,
|
|
10
|
+
build_connection_config,
|
|
11
|
+
default_statement_config,
|
|
12
|
+
register_json_codecs,
|
|
13
|
+
)
|
|
14
|
+
from sqlspec.adapters.cockroach_asyncpg._typing import (
|
|
15
|
+
CockroachAsyncpgConnection,
|
|
16
|
+
CockroachAsyncpgPool,
|
|
17
|
+
CockroachAsyncpgSessionContext,
|
|
18
|
+
)
|
|
19
|
+
from sqlspec.adapters.cockroach_asyncpg.driver import CockroachAsyncpgDriver, CockroachAsyncpgExceptionHandler
|
|
20
|
+
from sqlspec.config import AsyncDatabaseConfig, ExtensionConfigs
|
|
21
|
+
from sqlspec.driver._async import AsyncPoolConnectionContext, AsyncPoolSessionFactory
|
|
22
|
+
from sqlspec.extensions.events import EventRuntimeHints
|
|
23
|
+
from sqlspec.utils.config_tools import normalize_connection_config
|
|
24
|
+
from sqlspec.utils.serializers import from_json, to_json
|
|
25
|
+
|
|
26
|
+
if TYPE_CHECKING:
|
|
27
|
+
from collections.abc import Awaitable, Callable
|
|
28
|
+
|
|
29
|
+
from sqlspec.core import StatementConfig
|
|
30
|
+
from sqlspec.observability import ObservabilityConfig
|
|
31
|
+
|
|
32
|
+
__all__ = (
|
|
33
|
+
"CockroachAsyncpgConfig",
|
|
34
|
+
"CockroachAsyncpgConnectionConfig",
|
|
35
|
+
"CockroachAsyncpgDriverFeatures",
|
|
36
|
+
"CockroachAsyncpgPoolConfig",
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
class CockroachAsyncpgConnectionConfig(TypedDict):
|
|
41
|
+
"""AsyncPG connection parameters for CockroachDB."""
|
|
42
|
+
|
|
43
|
+
dsn: NotRequired[str]
|
|
44
|
+
host: NotRequired[str]
|
|
45
|
+
port: NotRequired[int]
|
|
46
|
+
user: NotRequired[str]
|
|
47
|
+
password: NotRequired[str]
|
|
48
|
+
database: NotRequired[str]
|
|
49
|
+
ssl: NotRequired[Any]
|
|
50
|
+
passfile: NotRequired[str]
|
|
51
|
+
direct_tls: NotRequired[bool]
|
|
52
|
+
connect_timeout: NotRequired[float]
|
|
53
|
+
command_timeout: NotRequired[float]
|
|
54
|
+
statement_cache_size: NotRequired[int]
|
|
55
|
+
max_cached_statement_lifetime: NotRequired[int]
|
|
56
|
+
max_cacheable_statement_size: NotRequired[int]
|
|
57
|
+
server_settings: NotRequired["dict[str, str]"]
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
class CockroachAsyncpgPoolConfig(CockroachAsyncpgConnectionConfig):
|
|
61
|
+
"""AsyncPG pool parameters for CockroachDB."""
|
|
62
|
+
|
|
63
|
+
min_size: NotRequired[int]
|
|
64
|
+
max_size: NotRequired[int]
|
|
65
|
+
max_queries: NotRequired[int]
|
|
66
|
+
max_inactive_connection_lifetime: NotRequired[float]
|
|
67
|
+
setup: NotRequired["Callable[[CockroachAsyncpgConnection], Awaitable[None]]"]
|
|
68
|
+
init: NotRequired["Callable[[CockroachAsyncpgConnection], Awaitable[None]]"]
|
|
69
|
+
extra: NotRequired["dict[str, Any]"]
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
class CockroachAsyncpgDriverFeatures(TypedDict):
|
|
73
|
+
"""Driver feature flags for CockroachDB AsyncPG adapter.
|
|
74
|
+
|
|
75
|
+
on_connection_create: Async callback executed when a connection is acquired from pool.
|
|
76
|
+
Receives the raw asyncpg connection for low-level driver configuration.
|
|
77
|
+
Called after internal setup (JSON codecs, pgvector registration).
|
|
78
|
+
"""
|
|
79
|
+
|
|
80
|
+
enable_auto_retry: NotRequired[bool]
|
|
81
|
+
max_retries: NotRequired[int]
|
|
82
|
+
retry_delay_base_ms: NotRequired[float]
|
|
83
|
+
retry_delay_max_ms: NotRequired[float]
|
|
84
|
+
enable_retry_logging: NotRequired[bool]
|
|
85
|
+
enable_follower_reads: NotRequired[bool]
|
|
86
|
+
default_staleness: NotRequired[str]
|
|
87
|
+
json_serializer: NotRequired["Callable[[Any], str]"]
|
|
88
|
+
json_deserializer: NotRequired["Callable[[str], Any]"]
|
|
89
|
+
enable_json_codecs: NotRequired[bool]
|
|
90
|
+
enable_pgvector: NotRequired[bool]
|
|
91
|
+
on_connection_create: "NotRequired[Callable[[CockroachAsyncpgConnection], Awaitable[None]]]"
|
|
92
|
+
enable_events: NotRequired[bool]
|
|
93
|
+
events_backend: NotRequired[str]
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class _CockroachAsyncpgSessionFactory(AsyncPoolSessionFactory):
|
|
97
|
+
"""Uses pool.acquire() context manager pattern instead of direct acquire/release."""
|
|
98
|
+
|
|
99
|
+
__slots__ = ("_ctx",)
|
|
100
|
+
|
|
101
|
+
def __init__(self, config: "CockroachAsyncpgConfig") -> None:
|
|
102
|
+
super().__init__(config)
|
|
103
|
+
self._ctx: Any | None = None
|
|
104
|
+
|
|
105
|
+
async def acquire_connection(self) -> "CockroachAsyncpgConnection":
|
|
106
|
+
pool = self._config.connection_instance
|
|
107
|
+
if pool is None:
|
|
108
|
+
pool = await self._config.create_pool()
|
|
109
|
+
self._config.connection_instance = pool
|
|
110
|
+
ctx = pool.acquire()
|
|
111
|
+
self._ctx = ctx
|
|
112
|
+
return cast("CockroachAsyncpgConnection", await ctx.__aenter__())
|
|
113
|
+
|
|
114
|
+
async def release_connection(self, _conn: "CockroachAsyncpgConnection", **kwargs: Any) -> None:
|
|
115
|
+
if self._ctx is not None:
|
|
116
|
+
await self._ctx.__aexit__(None, None, None)
|
|
117
|
+
self._ctx = None
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
class CockroachAsyncpgConnectionContext(AsyncPoolConnectionContext):
|
|
121
|
+
"""Async context manager for CockroachDB AsyncPG connections."""
|
|
122
|
+
|
|
123
|
+
__slots__ = ()
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class CockroachAsyncpgConfig(
|
|
127
|
+
AsyncDatabaseConfig[CockroachAsyncpgConnection, CockroachAsyncpgPool, CockroachAsyncpgDriver]
|
|
128
|
+
):
|
|
129
|
+
"""Configuration for CockroachDB using AsyncPG."""
|
|
130
|
+
|
|
131
|
+
driver_type: "ClassVar[type[CockroachAsyncpgDriver]]" = CockroachAsyncpgDriver
|
|
132
|
+
connection_type: "ClassVar[type[CockroachAsyncpgConnection]]" = CockroachAsyncpgConnection # type: ignore[assignment]
|
|
133
|
+
supports_transactional_ddl: "ClassVar[bool]" = True
|
|
134
|
+
supports_native_arrow_export: "ClassVar[bool]" = True
|
|
135
|
+
supports_native_arrow_import: "ClassVar[bool]" = True
|
|
136
|
+
supports_native_parquet_export: "ClassVar[bool]" = True
|
|
137
|
+
supports_native_parquet_import: "ClassVar[bool]" = True
|
|
138
|
+
_connection_context_class: "ClassVar[type[CockroachAsyncpgConnectionContext]]" = CockroachAsyncpgConnectionContext
|
|
139
|
+
_session_factory_class: "ClassVar[type[_CockroachAsyncpgSessionFactory]]" = _CockroachAsyncpgSessionFactory
|
|
140
|
+
_session_context_class: "ClassVar[type[CockroachAsyncpgSessionContext]]" = CockroachAsyncpgSessionContext
|
|
141
|
+
_default_statement_config = default_statement_config
|
|
142
|
+
|
|
143
|
+
def __init__(
|
|
144
|
+
self,
|
|
145
|
+
*,
|
|
146
|
+
connection_config: "CockroachAsyncpgPoolConfig | dict[str, Any] | None" = None,
|
|
147
|
+
connection_instance: "CockroachAsyncpgPool | None" = None,
|
|
148
|
+
migration_config: "dict[str, Any] | None" = None,
|
|
149
|
+
statement_config: "StatementConfig | None" = None,
|
|
150
|
+
driver_features: "CockroachAsyncpgDriverFeatures | dict[str, Any] | None" = None,
|
|
151
|
+
bind_key: "str | None" = None,
|
|
152
|
+
extension_config: "ExtensionConfigs | None" = None,
|
|
153
|
+
observability_config: "ObservabilityConfig | None" = None,
|
|
154
|
+
**kwargs: Any,
|
|
155
|
+
) -> None:
|
|
156
|
+
connection_config = normalize_connection_config(connection_config)
|
|
157
|
+
statement_config = statement_config or default_statement_config
|
|
158
|
+
statement_config, driver_features = apply_driver_features(statement_config, driver_features)
|
|
159
|
+
|
|
160
|
+
driver_features.setdefault("enable_auto_retry", True)
|
|
161
|
+
|
|
162
|
+
# Extract user connection hook before storing driver_features
|
|
163
|
+
features_dict = dict(driver_features) if driver_features else {}
|
|
164
|
+
self._user_connection_hook: Callable[[CockroachAsyncpgConnection], Awaitable[None]] | None = features_dict.pop(
|
|
165
|
+
"on_connection_create", None
|
|
166
|
+
)
|
|
167
|
+
|
|
168
|
+
super().__init__(
|
|
169
|
+
connection_config=connection_config,
|
|
170
|
+
connection_instance=connection_instance,
|
|
171
|
+
migration_config=migration_config,
|
|
172
|
+
statement_config=statement_config,
|
|
173
|
+
driver_features=features_dict,
|
|
174
|
+
bind_key=bind_key,
|
|
175
|
+
extension_config=extension_config,
|
|
176
|
+
observability_config=observability_config,
|
|
177
|
+
**kwargs,
|
|
178
|
+
)
|
|
179
|
+
|
|
180
|
+
async def _create_pool(self) -> "CockroachAsyncpgPool":
|
|
181
|
+
config = build_connection_config(self.connection_config)
|
|
182
|
+
config.setdefault("init", self._init_connection)
|
|
183
|
+
return await asyncpg_create_pool(**config)
|
|
184
|
+
|
|
185
|
+
async def _init_connection(self, connection: "CockroachAsyncpgConnection") -> None:
|
|
186
|
+
"""Initialize connection with JSON codecs and user callback."""
|
|
187
|
+
if self.driver_features.get("enable_json_codecs", True):
|
|
188
|
+
await register_json_codecs(
|
|
189
|
+
connection,
|
|
190
|
+
encoder=self.driver_features.get("json_serializer", to_json),
|
|
191
|
+
decoder=self.driver_features.get("json_deserializer", from_json),
|
|
192
|
+
)
|
|
193
|
+
|
|
194
|
+
if self._user_connection_hook is not None:
|
|
195
|
+
await self._user_connection_hook(connection)
|
|
196
|
+
|
|
197
|
+
async def _close_pool(self) -> None:
|
|
198
|
+
if not self.connection_instance:
|
|
199
|
+
return
|
|
200
|
+
await self.connection_instance.close()
|
|
201
|
+
self.connection_instance = None
|
|
202
|
+
|
|
203
|
+
async def create_connection(self) -> "CockroachAsyncpgConnection":
|
|
204
|
+
if self.connection_instance is None:
|
|
205
|
+
self.connection_instance = await self.create_pool()
|
|
206
|
+
return cast("CockroachAsyncpgConnection", await self.connection_instance.acquire())
|
|
207
|
+
|
|
208
|
+
def provide_session(
|
|
209
|
+
self,
|
|
210
|
+
*_args: Any,
|
|
211
|
+
statement_config: "StatementConfig | None" = None,
|
|
212
|
+
follower_reads: bool | None = None,
|
|
213
|
+
staleness: str | None = None,
|
|
214
|
+
**_kwargs: Any,
|
|
215
|
+
) -> "CockroachAsyncpgSessionContext":
|
|
216
|
+
factory = _CockroachAsyncpgSessionFactory(self)
|
|
217
|
+
driver_features = dict(self.driver_features)
|
|
218
|
+
if follower_reads is not None:
|
|
219
|
+
driver_features["enable_follower_reads"] = follower_reads
|
|
220
|
+
if staleness is not None:
|
|
221
|
+
driver_features["default_staleness"] = staleness
|
|
222
|
+
|
|
223
|
+
return CockroachAsyncpgSessionContext(
|
|
224
|
+
acquire_connection=factory.acquire_connection,
|
|
225
|
+
release_connection=factory.release_connection,
|
|
226
|
+
statement_config=statement_config or self.statement_config or default_statement_config,
|
|
227
|
+
driver_features=driver_features,
|
|
228
|
+
prepare_driver=self._prepare_driver,
|
|
229
|
+
)
|
|
230
|
+
|
|
231
|
+
async def provide_pool(self, *args: Any, **kwargs: Any) -> "CockroachAsyncpgPool":
|
|
232
|
+
if not self.connection_instance:
|
|
233
|
+
self.connection_instance = await self.create_pool()
|
|
234
|
+
return self.connection_instance
|
|
235
|
+
|
|
236
|
+
def get_signature_namespace(self) -> "dict[str, Any]":
|
|
237
|
+
namespace = super().get_signature_namespace()
|
|
238
|
+
namespace.update({
|
|
239
|
+
"CockroachAsyncpgConnectionConfig": CockroachAsyncpgConnectionConfig,
|
|
240
|
+
"CockroachAsyncpgPoolConfig": CockroachAsyncpgPoolConfig,
|
|
241
|
+
"CockroachAsyncpgDriver": CockroachAsyncpgDriver,
|
|
242
|
+
"CockroachAsyncpgExceptionHandler": CockroachAsyncpgExceptionHandler,
|
|
243
|
+
"CockroachAsyncpgSessionContext": CockroachAsyncpgSessionContext,
|
|
244
|
+
})
|
|
245
|
+
return namespace
|
|
246
|
+
|
|
247
|
+
def get_event_runtime_hints(self) -> "EventRuntimeHints":
|
|
248
|
+
return EventRuntimeHints(poll_interval=0.5, select_for_update=True, skip_locked=True)
|
|
Binary file
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""CockroachDB AsyncPG adapter helpers."""
|
|
2
|
+
|
|
3
|
+
import secrets
|
|
4
|
+
from dataclasses import dataclass
|
|
5
|
+
from typing import TYPE_CHECKING, Any, Final
|
|
6
|
+
|
|
7
|
+
from sqlspec.utils.type_guards import has_sqlstate
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from collections.abc import Mapping
|
|
11
|
+
|
|
12
|
+
__all__ = ("CockroachAsyncpgRetryConfig", "calculate_backoff_seconds", "is_retryable_error")
|
|
13
|
+
|
|
14
|
+
# Retry configuration defaults (module-level for mypyc compatibility)
|
|
15
|
+
_DEFAULT_MAX_RETRIES: Final[int] = 10
|
|
16
|
+
_DEFAULT_BASE_DELAY_MS: Final[float] = 50.0
|
|
17
|
+
_DEFAULT_MAX_DELAY_MS: Final[float] = 5000.0
|
|
18
|
+
_DEFAULT_ENABLE_LOGGING: Final[bool] = True
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
@dataclass(frozen=True)
|
|
22
|
+
class CockroachAsyncpgRetryConfig:
|
|
23
|
+
"""CockroachDB asyncpg transaction retry configuration."""
|
|
24
|
+
|
|
25
|
+
max_retries: int = _DEFAULT_MAX_RETRIES
|
|
26
|
+
base_delay_ms: float = _DEFAULT_BASE_DELAY_MS
|
|
27
|
+
max_delay_ms: float = _DEFAULT_MAX_DELAY_MS
|
|
28
|
+
enable_logging: bool = _DEFAULT_ENABLE_LOGGING
|
|
29
|
+
|
|
30
|
+
@classmethod
|
|
31
|
+
def from_features(cls, driver_features: "Mapping[str, Any]") -> "CockroachAsyncpgRetryConfig":
|
|
32
|
+
"""Build retry config from driver feature mappings."""
|
|
33
|
+
return cls(
|
|
34
|
+
max_retries=int(driver_features.get("max_retries", _DEFAULT_MAX_RETRIES)),
|
|
35
|
+
base_delay_ms=float(driver_features.get("retry_delay_base_ms", _DEFAULT_BASE_DELAY_MS)),
|
|
36
|
+
max_delay_ms=float(driver_features.get("retry_delay_max_ms", _DEFAULT_MAX_DELAY_MS)),
|
|
37
|
+
enable_logging=bool(driver_features.get("enable_retry_logging", _DEFAULT_ENABLE_LOGGING)),
|
|
38
|
+
)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
def is_retryable_error(error: BaseException) -> bool:
|
|
42
|
+
"""Return True when the error should trigger a CockroachDB retry."""
|
|
43
|
+
if has_sqlstate(error):
|
|
44
|
+
return str(error.sqlstate) == "40001"
|
|
45
|
+
return False
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def calculate_backoff_seconds(attempt: int, config: "CockroachAsyncpgRetryConfig") -> float:
|
|
49
|
+
"""Calculate exponential backoff delay in seconds."""
|
|
50
|
+
base: float = config.base_delay_ms * (2**attempt)
|
|
51
|
+
scale: int = 1000
|
|
52
|
+
max_jitter: int = max(int(base * scale), 0)
|
|
53
|
+
jitter: float = secrets.randbelow(max_jitter + 1) / scale if max_jitter else 0.0
|
|
54
|
+
delay_ms: float = min(base + jitter, config.max_delay_ms)
|
|
55
|
+
return delay_ms / 1000.0
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"""CockroachDB AsyncPG data dictionary."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, ClassVar
|
|
4
|
+
|
|
5
|
+
from mypy_extensions import mypyc_attr
|
|
6
|
+
|
|
7
|
+
from sqlspec.data_dictionary.dialects.cockroachdb import resolve_cockroachdb_json_type
|
|
8
|
+
from sqlspec.driver import AsyncDataDictionaryBase
|
|
9
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from sqlspec.adapters.cockroach_asyncpg.driver import CockroachAsyncpgDriver
|
|
13
|
+
|
|
14
|
+
__all__ = ("CockroachAsyncpgDataDictionary",)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
18
|
+
class CockroachAsyncpgDataDictionary(AsyncDataDictionaryBase):
|
|
19
|
+
"""CockroachDB async data dictionary (AsyncPG)."""
|
|
20
|
+
|
|
21
|
+
dialect: ClassVar[str] = "cockroachdb"
|
|
22
|
+
|
|
23
|
+
def __init__(self) -> None:
|
|
24
|
+
super().__init__()
|
|
25
|
+
|
|
26
|
+
async def get_version(self, driver: "CockroachAsyncpgDriver") -> "VersionInfo | None":
|
|
27
|
+
driver_id = id(driver)
|
|
28
|
+
if driver_id in self._version_fetch_attempted:
|
|
29
|
+
return self._version_cache.get(driver_id)
|
|
30
|
+
|
|
31
|
+
version_value = await driver.select_value_or_none(self.get_query("version"))
|
|
32
|
+
if not version_value:
|
|
33
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
34
|
+
self.cache_version(driver_id, None)
|
|
35
|
+
return None
|
|
36
|
+
|
|
37
|
+
version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
|
|
38
|
+
if version_info is None:
|
|
39
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
40
|
+
self.cache_version(driver_id, None)
|
|
41
|
+
return None
|
|
42
|
+
|
|
43
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
44
|
+
self.cache_version(driver_id, version_info)
|
|
45
|
+
return version_info
|
|
46
|
+
|
|
47
|
+
async def get_feature_flag(self, driver: "CockroachAsyncpgDriver", feature: str) -> bool:
|
|
48
|
+
version_info = await self.get_version(driver)
|
|
49
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
50
|
+
|
|
51
|
+
async def get_optimal_type(self, driver: "CockroachAsyncpgDriver", type_category: str) -> str:
|
|
52
|
+
config = self.get_dialect_config()
|
|
53
|
+
if type_category == "json":
|
|
54
|
+
return resolve_cockroachdb_json_type(await self.get_version(driver))
|
|
55
|
+
return config.get_optimal_type(type_category)
|
|
56
|
+
|
|
57
|
+
async def get_tables(self, driver: "CockroachAsyncpgDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
58
|
+
schema_name = self.resolve_schema(schema)
|
|
59
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
60
|
+
return await driver.select(
|
|
61
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
async def get_columns(
|
|
65
|
+
self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
66
|
+
) -> "list[ColumnMetadata]":
|
|
67
|
+
schema_name = self.resolve_schema(schema)
|
|
68
|
+
if table is None:
|
|
69
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
70
|
+
return await driver.select(
|
|
71
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
72
|
+
)
|
|
73
|
+
|
|
74
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
75
|
+
return await driver.select(
|
|
76
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
async def get_indexes(
|
|
80
|
+
self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
81
|
+
) -> "list[IndexMetadata]":
|
|
82
|
+
schema_name = self.resolve_schema(schema)
|
|
83
|
+
if table is None:
|
|
84
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
85
|
+
return await driver.select(
|
|
86
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
90
|
+
return await driver.select(
|
|
91
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
92
|
+
)
|
|
93
|
+
|
|
94
|
+
async def get_foreign_keys(
|
|
95
|
+
self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
96
|
+
) -> "list[ForeignKeyMetadata]":
|
|
97
|
+
schema_name = self.resolve_schema(schema)
|
|
98
|
+
if table is None:
|
|
99
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
100
|
+
return await driver.select(
|
|
101
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
102
|
+
)
|
|
103
|
+
|
|
104
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
105
|
+
return await driver.select(
|
|
106
|
+
self.get_query("foreign_keys_by_table"),
|
|
107
|
+
table_name=table,
|
|
108
|
+
schema_name=schema_name,
|
|
109
|
+
schema_type=ForeignKeyMetadata,
|
|
110
|
+
)
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""CockroachDB AsyncPG driver implementation."""
|
|
2
|
+
|
|
3
|
+
import asyncio
|
|
4
|
+
import contextlib
|
|
5
|
+
from typing import TYPE_CHECKING, Any, cast
|
|
6
|
+
|
|
7
|
+
import asyncpg
|
|
8
|
+
|
|
9
|
+
from sqlspec.adapters.asyncpg.core import create_mapped_exception, driver_profile
|
|
10
|
+
from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
|
|
11
|
+
from sqlspec.adapters.cockroach_asyncpg._typing import CockroachAsyncpgSessionContext
|
|
12
|
+
from sqlspec.adapters.cockroach_asyncpg.core import (
|
|
13
|
+
CockroachAsyncpgRetryConfig,
|
|
14
|
+
calculate_backoff_seconds,
|
|
15
|
+
is_retryable_error,
|
|
16
|
+
)
|
|
17
|
+
from sqlspec.adapters.cockroach_asyncpg.data_dictionary import CockroachAsyncpgDataDictionary
|
|
18
|
+
from sqlspec.core import SQL, register_driver_profile
|
|
19
|
+
from sqlspec.driver import BaseAsyncExceptionHandler
|
|
20
|
+
from sqlspec.exceptions import SerializationConflictError, TransactionRetryError
|
|
21
|
+
from sqlspec.utils.logging import get_logger
|
|
22
|
+
from sqlspec.utils.type_guards import has_sqlstate
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from collections.abc import Callable
|
|
26
|
+
|
|
27
|
+
from sqlspec.adapters.cockroach_asyncpg._typing import CockroachAsyncpgConnection
|
|
28
|
+
from sqlspec.core import StatementConfig
|
|
29
|
+
from sqlspec.driver import ExecutionResult
|
|
30
|
+
|
|
31
|
+
__all__ = ("CockroachAsyncpgDriver", "CockroachAsyncpgExceptionHandler", "CockroachAsyncpgSessionContext")
|
|
32
|
+
|
|
33
|
+
logger = get_logger("sqlspec.adapters.cockroach_asyncpg")
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class CockroachAsyncpgExceptionHandler(BaseAsyncExceptionHandler):
|
|
37
|
+
"""Async context manager for CockroachDB AsyncPG exceptions."""
|
|
38
|
+
|
|
39
|
+
__slots__ = ()
|
|
40
|
+
|
|
41
|
+
def _handle_exception(self, exc_type: "type[BaseException] | None", exc_val: "BaseException") -> bool:
|
|
42
|
+
_ = exc_type
|
|
43
|
+
if isinstance(exc_val, asyncpg.PostgresError) or has_sqlstate(exc_val):
|
|
44
|
+
if has_sqlstate(exc_val) and str(exc_val.sqlstate) == "40001":
|
|
45
|
+
self.pending_exception = SerializationConflictError(str(exc_val))
|
|
46
|
+
return True
|
|
47
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
48
|
+
return True
|
|
49
|
+
return False
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
class CockroachAsyncpgDriver(AsyncpgDriver):
|
|
53
|
+
"""CockroachDB AsyncPG driver with retry support."""
|
|
54
|
+
|
|
55
|
+
__slots__ = ("_enable_retry", "_follower_staleness", "_retry_config")
|
|
56
|
+
dialect = "postgres"
|
|
57
|
+
|
|
58
|
+
def __init__(
|
|
59
|
+
self,
|
|
60
|
+
connection: "CockroachAsyncpgConnection",
|
|
61
|
+
statement_config: "StatementConfig | None" = None,
|
|
62
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
63
|
+
) -> None:
|
|
64
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
65
|
+
self._retry_config = CockroachAsyncpgRetryConfig.from_features(self.driver_features)
|
|
66
|
+
self._enable_retry = bool(self.driver_features.get("enable_auto_retry", True))
|
|
67
|
+
self._follower_staleness = cast("str | None", self.driver_features.get("default_staleness"))
|
|
68
|
+
# Data dictionary is lazily initialized in property; use parent slot
|
|
69
|
+
self._data_dictionary = None
|
|
70
|
+
|
|
71
|
+
async def _execute_with_retry(self, operation: "Callable[..., Any]", *args: Any) -> "ExecutionResult":
|
|
72
|
+
if not self._enable_retry:
|
|
73
|
+
return cast("ExecutionResult", await operation(*args))
|
|
74
|
+
|
|
75
|
+
last_error: Exception | None = None
|
|
76
|
+
|
|
77
|
+
for attempt in range(self._retry_config.max_retries + 1):
|
|
78
|
+
try:
|
|
79
|
+
return cast("ExecutionResult", await operation(*args))
|
|
80
|
+
except Exception as exc:
|
|
81
|
+
last_error = exc
|
|
82
|
+
if not is_retryable_error(exc) or attempt >= self._retry_config.max_retries:
|
|
83
|
+
raise
|
|
84
|
+
with contextlib.suppress(Exception):
|
|
85
|
+
await self.connection.execute("ROLLBACK")
|
|
86
|
+
delay = calculate_backoff_seconds(attempt, self._retry_config)
|
|
87
|
+
if self._retry_config.enable_logging:
|
|
88
|
+
logger.debug("CockroachDB retry %s/%s after %.3fs", attempt + 1, self._retry_config.max_retries, delay)
|
|
89
|
+
await asyncio.sleep(delay)
|
|
90
|
+
|
|
91
|
+
msg = "CockroachDB transaction retry limit exceeded"
|
|
92
|
+
raise TransactionRetryError(msg) from last_error
|
|
93
|
+
|
|
94
|
+
async def _apply_follower_reads(self, cursor: "CockroachAsyncpgConnection") -> None:
|
|
95
|
+
if not self.driver_features.get("enable_follower_reads", False):
|
|
96
|
+
return
|
|
97
|
+
if not self._follower_staleness:
|
|
98
|
+
return
|
|
99
|
+
await cursor.execute(f"SET TRANSACTION AS OF SYSTEM TIME {self._follower_staleness}")
|
|
100
|
+
|
|
101
|
+
async def _dispatch_execute_impl(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
|
|
102
|
+
if statement.returns_rows():
|
|
103
|
+
await self._apply_follower_reads(cursor)
|
|
104
|
+
return await super().dispatch_execute(cursor, statement)
|
|
105
|
+
|
|
106
|
+
async def _dispatch_execute_many_impl(
|
|
107
|
+
self, cursor: "CockroachAsyncpgConnection", statement: SQL
|
|
108
|
+
) -> "ExecutionResult":
|
|
109
|
+
return await super().dispatch_execute_many(cursor, statement)
|
|
110
|
+
|
|
111
|
+
async def _dispatch_execute_script_impl(
|
|
112
|
+
self, cursor: "CockroachAsyncpgConnection", statement: SQL
|
|
113
|
+
) -> "ExecutionResult":
|
|
114
|
+
return await super().dispatch_execute_script(cursor, statement)
|
|
115
|
+
|
|
116
|
+
async def dispatch_execute(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
117
|
+
if not self._enable_retry:
|
|
118
|
+
return await self._dispatch_execute_impl(cursor, statement)
|
|
119
|
+
return await self._execute_with_retry(self._dispatch_execute_impl, cursor, statement)
|
|
120
|
+
|
|
121
|
+
async def dispatch_execute_many(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
122
|
+
if not self._enable_retry:
|
|
123
|
+
return await super().dispatch_execute_many(cursor, statement)
|
|
124
|
+
return await self._execute_with_retry(self._dispatch_execute_many_impl, cursor, statement)
|
|
125
|
+
|
|
126
|
+
async def dispatch_execute_script(self, cursor: Any, statement: SQL) -> "ExecutionResult":
|
|
127
|
+
if not self._enable_retry:
|
|
128
|
+
return await super().dispatch_execute_script(cursor, statement)
|
|
129
|
+
return await self._execute_with_retry(self._dispatch_execute_script_impl, cursor, statement)
|
|
130
|
+
|
|
131
|
+
def handle_database_exceptions(self) -> "CockroachAsyncpgExceptionHandler": # type: ignore[override]
|
|
132
|
+
return CockroachAsyncpgExceptionHandler()
|
|
133
|
+
|
|
134
|
+
@property
|
|
135
|
+
def data_dictionary(self) -> "CockroachAsyncpgDataDictionary": # type: ignore[override]
|
|
136
|
+
if self._data_dictionary is None:
|
|
137
|
+
# Intentionally assign CockroachDB-specific data dictionary to parent slot
|
|
138
|
+
object.__setattr__(self, "_data_dictionary", CockroachAsyncpgDataDictionary())
|
|
139
|
+
return cast("CockroachAsyncpgDataDictionary", self._data_dictionary)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
register_driver_profile("cockroach_asyncpg", driver_profile)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""CockroachDB event queue store for asyncpg driver."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.cockroach_asyncpg.config import CockroachAsyncpgConfig
|
|
4
|
+
from sqlspec.extensions.events import BaseEventQueueStore
|
|
5
|
+
|
|
6
|
+
__all__ = ("CockroachAsyncpgEventQueueStore",)
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class CockroachAsyncpgEventQueueStore(BaseEventQueueStore[CockroachAsyncpgConfig]):
|
|
10
|
+
"""Queue DDL for CockroachDB asyncpg configs.
|
|
11
|
+
|
|
12
|
+
CockroachDB uses JSONB for efficient JSON storage and TIMESTAMPTZ for
|
|
13
|
+
timezone-aware timestamps.
|
|
14
|
+
"""
|
|
15
|
+
|
|
16
|
+
__slots__ = ()
|
|
17
|
+
|
|
18
|
+
def _column_types(self) -> "tuple[str, str, str]":
|
|
19
|
+
"""Return CockroachDB-optimized column types for the event queue."""
|
|
20
|
+
return "JSONB", "JSONB", "TIMESTAMPTZ"
|