sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.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.
- ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/__init__.py +140 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_serialization.py +315 -0
- sqlspec/_typing.py +700 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +5 -0
- sqlspec/adapters/adbc/_typing.py +82 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1273 -0
- sqlspec/adapters/adbc/config.py +295 -0
- sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/core.py +735 -0
- sqlspec/adapters/adbc/data_dictionary.py +334 -0
- sqlspec/adapters/adbc/driver.py +529 -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 +502 -0
- sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/adbc/type_converter.py +140 -0
- sqlspec/adapters/aiosqlite/__init__.py +25 -0
- sqlspec/adapters/aiosqlite/_typing.py +82 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +818 -0
- sqlspec/adapters/aiosqlite/config.py +334 -0
- sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
- sqlspec/adapters/aiosqlite/driver.py +313 -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.py +533 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +87 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +703 -0
- sqlspec/adapters/asyncmy/config.py +302 -0
- sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncmy/core.py +360 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
- sqlspec/adapters/asyncmy/driver.py +383 -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 +19 -0
- sqlspec/adapters/asyncpg/_typing.py +88 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +748 -0
- sqlspec/adapters/asyncpg/config.py +569 -0
- sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/asyncpg/core.py +367 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/backend.py +286 -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 +14 -0
- sqlspec/adapters/bigquery/_typing.py +86 -0
- sqlspec/adapters/bigquery/adk/__init__.py +5 -0
- sqlspec/adapters/bigquery/adk/store.py +827 -0
- sqlspec/adapters/bigquery/config.py +353 -0
- sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/core.py +715 -0
- sqlspec/adapters/bigquery/data_dictionary.py +128 -0
- sqlspec/adapters/bigquery/driver.py +548 -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.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
- sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +144 -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 +38 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
- sqlspec/adapters/cockroach_psycopg/config.py +484 -0
- sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +284 -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 +325 -0
- sqlspec/adapters/duckdb/__init__.py +25 -0
- sqlspec/adapters/duckdb/_typing.py +81 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +850 -0
- sqlspec/adapters/duckdb/config.py +463 -0
- sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/core.py +257 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +430 -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.py +293 -0
- sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mock/__init__.py +72 -0
- sqlspec/adapters/mock/_typing.py +147 -0
- sqlspec/adapters/mock/config.py +483 -0
- sqlspec/adapters/mock/core.py +319 -0
- sqlspec/adapters/mock/data_dictionary.py +366 -0
- sqlspec/adapters/mock/driver.py +721 -0
- sqlspec/adapters/mysqlconnector/__init__.py +36 -0
- sqlspec/adapters/mysqlconnector/_typing.py +141 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
- sqlspec/adapters/mysqlconnector/config.py +394 -0
- sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/mysqlconnector/core.py +303 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
- sqlspec/adapters/mysqlconnector/driver.py +483 -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 +60 -0
- sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
- sqlspec/adapters/oracledb/_typing.py +182 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
- sqlspec/adapters/oracledb/adk/__init__.py +10 -0
- sqlspec/adapters/oracledb/adk/store.py +2369 -0
- sqlspec/adapters/oracledb/config.py +550 -0
- sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/core.py +543 -0
- sqlspec/adapters/oracledb/data_dictionary.py +536 -0
- sqlspec/adapters/oracledb/driver.py +1229 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/backend.py +347 -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 +535 -0
- sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +17 -0
- sqlspec/adapters/psqlpy/_typing.py +79 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +766 -0
- sqlspec/adapters/psqlpy/config.py +304 -0
- sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/core.py +480 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
- sqlspec/adapters/psqlpy/driver.py +438 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/backend.py +310 -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.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +32 -0
- sqlspec/adapters/psycopg/_typing.py +164 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1387 -0
- sqlspec/adapters/psycopg/config.py +576 -0
- sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/core.py +450 -0
- sqlspec/adapters/psycopg/data_dictionary.py +289 -0
- sqlspec/adapters/psycopg/driver.py +975 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/backend.py +458 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +552 -0
- sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +71 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +540 -0
- sqlspec/adapters/pymysql/config.py +195 -0
- sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/pymysql/core.py +299 -0
- sqlspec/adapters/pymysql/data_dictionary.py +122 -0
- sqlspec/adapters/pymysql/driver.py +259 -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.py +137 -0
- sqlspec/adapters/spanner/__init__.py +40 -0
- sqlspec/adapters/spanner/_typing.py +86 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +732 -0
- sqlspec/adapters/spanner/config.py +352 -0
- sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/core.py +188 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/dialect/__init__.py +6 -0
- sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
- sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
- sqlspec/adapters/spanner/driver.py +373 -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.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/spanner/type_converter.py +331 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +80 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +958 -0
- sqlspec/adapters/sqlite/config.py +280 -0
- sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/core.py +312 -0
- sqlspec/adapters/sqlite/data_dictionary.py +202 -0
- sqlspec/adapters/sqlite/driver.py +359 -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.py +198 -0
- sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +747 -0
- sqlspec/builder/__init__.py +179 -0
- sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_base.py +1022 -0
- sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_ddl.py +1642 -0
- sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_dml.py +365 -0
- sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_factory.py +1697 -0
- sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_insert.py +328 -0
- sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_join.py +499 -0
- sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_merge.py +821 -0
- sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_parsing_utils.py +297 -0
- sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_select.py +1660 -0
- sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_temporal.py +139 -0
- sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_expressions.py +267 -0
- sqlspec/cli.py +911 -0
- sqlspec/config.py +1755 -0
- sqlspec/core/__init__.py +374 -0
- sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/cache.py +1069 -0
- sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/compiler.py +954 -0
- sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/filters.py +952 -0
- sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/hashing.py +262 -0
- sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +71 -0
- sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_alignment.py +270 -0
- sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_converter.py +543 -0
- sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_processor.py +505 -0
- sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_transformers.py +292 -0
- sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_types.py +499 -0
- sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/parameters/_validator.py +180 -0
- sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/pipeline.py +319 -0
- sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/query_modifiers.py +437 -0
- sqlspec/core/result/__init__.py +23 -0
- sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_base.py +1121 -0
- sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/splitter.py +966 -0
- sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/statement.py +1503 -0
- sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/core/type_converter.py +339 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.py +123 -0
- sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +49 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
- sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +42 -0
- sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +34 -0
- sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +46 -0
- sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +42 -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/driver/__init__.py +32 -0
- sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_async.py +1737 -0
- sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_common.py +1478 -0
- sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sql_helpers.py +148 -0
- sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_storage_helpers.py +144 -0
- sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/driver/_sync.py +1710 -0
- sqlspec/exceptions.py +338 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +70 -0
- sqlspec/extensions/adk/_types.py +51 -0
- sqlspec/extensions/adk/converters.py +172 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +149 -0
- sqlspec/extensions/adk/memory/service.py +217 -0
- sqlspec/extensions/adk/memory/store.py +569 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +225 -0
- sqlspec/extensions/adk/store.py +567 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +461 -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 +19 -0
- sqlspec/extensions/fastapi/extension.py +351 -0
- sqlspec/extensions/fastapi/providers.py +607 -0
- sqlspec/extensions/flask/__init__.py +37 -0
- sqlspec/extensions/flask/_state.py +76 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +519 -0
- sqlspec/extensions/litestar/__init__.py +28 -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 +671 -0
- sqlspec/extensions/litestar/providers.py +526 -0
- sqlspec/extensions/litestar/store.py +296 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/starlette/__init__.py +19 -0
- sqlspec/extensions/starlette/_state.py +30 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +346 -0
- sqlspec/extensions/starlette/middleware.py +235 -0
- sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/loader.py +702 -0
- sqlspec/migrations/__init__.py +36 -0
- sqlspec/migrations/base.py +731 -0
- sqlspec/migrations/commands.py +1232 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.py +1172 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.py +611 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.py +207 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +55 -0
- sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_config.py +348 -0
- sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_dispatcher.py +152 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_observer.py +357 -0
- sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_runtime.py +420 -0
- sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +916 -0
- sqlspec/py.typed +0 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_utils.py +104 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.py +253 -0
- sqlspec/storage/backends/fsspec.py +529 -0
- sqlspec/storage/backends/local.py +441 -0
- sqlspec/storage/backends/obstore.py +916 -0
- sqlspec/storage/errors.py +104 -0
- sqlspec/storage/pipeline.py +582 -0
- sqlspec/storage/registry.py +301 -0
- sqlspec/typing.py +395 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +318 -0
- sqlspec/utils/config_tools.py +332 -0
- sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.py +190 -0
- sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/fixtures.py +258 -0
- sqlspec/utils/logging.py +222 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/portal.py +375 -0
- sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/schema.py +485 -0
- sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/serializers.py +408 -0
- sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/sync_tools.py +311 -0
- sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/text.py +108 -0
- sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_converters.py +128 -0
- sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/type_guards.py +1360 -0
- sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
- sqlspec/utils/uuids.py +225 -0
- sqlspec-0.36.0.dist-info/METADATA +205 -0
- sqlspec-0.36.0.dist-info/RECORD +531 -0
- sqlspec-0.36.0.dist-info/WHEEL +7 -0
- sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
- sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
|
@@ -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,107 @@
|
|
|
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.driver import AsyncDataDictionaryBase
|
|
8
|
+
from sqlspec.typing import ColumnMetadata, ForeignKeyMetadata, IndexMetadata, TableMetadata, VersionInfo
|
|
9
|
+
|
|
10
|
+
if TYPE_CHECKING:
|
|
11
|
+
from sqlspec.adapters.cockroach_asyncpg.driver import CockroachAsyncpgDriver
|
|
12
|
+
|
|
13
|
+
__all__ = ("CockroachAsyncpgDataDictionary",)
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
@mypyc_attr(allow_interpreted_subclasses=True, native_class=False)
|
|
17
|
+
class CockroachAsyncpgDataDictionary(AsyncDataDictionaryBase):
|
|
18
|
+
"""CockroachDB async data dictionary (AsyncPG)."""
|
|
19
|
+
|
|
20
|
+
dialect: ClassVar[str] = "cockroachdb"
|
|
21
|
+
|
|
22
|
+
def __init__(self) -> None:
|
|
23
|
+
super().__init__()
|
|
24
|
+
|
|
25
|
+
async def get_version(self, driver: "CockroachAsyncpgDriver") -> "VersionInfo | None":
|
|
26
|
+
driver_id = id(driver)
|
|
27
|
+
if driver_id in self._version_fetch_attempted:
|
|
28
|
+
return self._version_cache.get(driver_id)
|
|
29
|
+
|
|
30
|
+
version_value = await driver.select_value_or_none(self.get_query("version"))
|
|
31
|
+
if not version_value:
|
|
32
|
+
self._log_version_unavailable(type(self).dialect, "missing")
|
|
33
|
+
self.cache_version(driver_id, None)
|
|
34
|
+
return None
|
|
35
|
+
|
|
36
|
+
version_info = self.parse_version_with_pattern(self.get_dialect_config().version_pattern, str(version_value))
|
|
37
|
+
if version_info is None:
|
|
38
|
+
self._log_version_unavailable(type(self).dialect, "parse_failed")
|
|
39
|
+
self.cache_version(driver_id, None)
|
|
40
|
+
return None
|
|
41
|
+
|
|
42
|
+
self._log_version_detected(type(self).dialect, version_info)
|
|
43
|
+
self.cache_version(driver_id, version_info)
|
|
44
|
+
return version_info
|
|
45
|
+
|
|
46
|
+
async def get_feature_flag(self, driver: "CockroachAsyncpgDriver", feature: str) -> bool:
|
|
47
|
+
version_info = await self.get_version(driver)
|
|
48
|
+
return self.resolve_feature_flag(feature, version_info)
|
|
49
|
+
|
|
50
|
+
async def get_optimal_type(self, driver: "CockroachAsyncpgDriver", type_category: str) -> str:
|
|
51
|
+
config = self.get_dialect_config()
|
|
52
|
+
return config.get_optimal_type(type_category)
|
|
53
|
+
|
|
54
|
+
async def get_tables(self, driver: "CockroachAsyncpgDriver", schema: "str | None" = None) -> "list[TableMetadata]":
|
|
55
|
+
schema_name = self.resolve_schema(schema)
|
|
56
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="tables")
|
|
57
|
+
return await driver.select(
|
|
58
|
+
self.get_query("tables_by_schema"), schema_name=schema_name, schema_type=TableMetadata
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
async def get_columns(
|
|
62
|
+
self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
63
|
+
) -> "list[ColumnMetadata]":
|
|
64
|
+
schema_name = self.resolve_schema(schema)
|
|
65
|
+
if table is None:
|
|
66
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="columns")
|
|
67
|
+
return await driver.select(
|
|
68
|
+
self.get_query("columns_by_schema"), schema_name=schema_name, schema_type=ColumnMetadata
|
|
69
|
+
)
|
|
70
|
+
|
|
71
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="columns")
|
|
72
|
+
return await driver.select(
|
|
73
|
+
self.get_query("columns_by_table"), schema_name=schema_name, table_name=table, schema_type=ColumnMetadata
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
async def get_indexes(
|
|
77
|
+
self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
78
|
+
) -> "list[IndexMetadata]":
|
|
79
|
+
schema_name = self.resolve_schema(schema)
|
|
80
|
+
if table is None:
|
|
81
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="indexes")
|
|
82
|
+
return await driver.select(
|
|
83
|
+
self.get_query("indexes_by_schema"), schema_name=schema_name, schema_type=IndexMetadata
|
|
84
|
+
)
|
|
85
|
+
|
|
86
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="indexes")
|
|
87
|
+
return await driver.select(
|
|
88
|
+
self.get_query("indexes_by_table"), schema_name=schema_name, table_name=table, schema_type=IndexMetadata
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
async def get_foreign_keys(
|
|
92
|
+
self, driver: "CockroachAsyncpgDriver", table: "str | None" = None, schema: "str | None" = None
|
|
93
|
+
) -> "list[ForeignKeyMetadata]":
|
|
94
|
+
schema_name = self.resolve_schema(schema)
|
|
95
|
+
if table is None:
|
|
96
|
+
self._log_schema_introspect(driver, schema_name=schema_name, table_name=None, operation="foreign_keys")
|
|
97
|
+
return await driver.select(
|
|
98
|
+
self.get_query("foreign_keys_by_schema"), schema_name=schema_name, schema_type=ForeignKeyMetadata
|
|
99
|
+
)
|
|
100
|
+
|
|
101
|
+
self._log_table_describe(driver, schema_name=schema_name, table_name=table, operation="foreign_keys")
|
|
102
|
+
return await driver.select(
|
|
103
|
+
self.get_query("foreign_keys_by_table"),
|
|
104
|
+
table_name=table,
|
|
105
|
+
schema_name=schema_name,
|
|
106
|
+
schema_type=ForeignKeyMetadata,
|
|
107
|
+
)
|
|
@@ -0,0 +1,144 @@
|
|
|
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.exceptions import SerializationConflictError, TransactionRetryError
|
|
20
|
+
from sqlspec.utils.logging import get_logger
|
|
21
|
+
from sqlspec.utils.type_guards import has_sqlstate
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from collections.abc import Callable
|
|
25
|
+
|
|
26
|
+
from sqlspec.adapters.cockroach_asyncpg._typing import CockroachAsyncpgConnection
|
|
27
|
+
from sqlspec.core import StatementConfig
|
|
28
|
+
from sqlspec.driver import ExecutionResult
|
|
29
|
+
|
|
30
|
+
__all__ = ("CockroachAsyncpgDriver", "CockroachAsyncpgExceptionHandler", "CockroachAsyncpgSessionContext")
|
|
31
|
+
|
|
32
|
+
logger = get_logger("sqlspec.adapters.cockroach_asyncpg")
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
class CockroachAsyncpgExceptionHandler:
|
|
36
|
+
"""Async context manager for CockroachDB AsyncPG exceptions."""
|
|
37
|
+
|
|
38
|
+
__slots__ = ("pending_exception",)
|
|
39
|
+
|
|
40
|
+
def __init__(self) -> None:
|
|
41
|
+
self.pending_exception: Exception | None = None
|
|
42
|
+
|
|
43
|
+
async def __aenter__(self) -> "CockroachAsyncpgExceptionHandler":
|
|
44
|
+
return self
|
|
45
|
+
|
|
46
|
+
async def __aexit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> bool:
|
|
47
|
+
if exc_val is None:
|
|
48
|
+
return False
|
|
49
|
+
if isinstance(exc_val, asyncpg.PostgresError) or has_sqlstate(exc_val):
|
|
50
|
+
if has_sqlstate(exc_val) and str(exc_val.sqlstate) == "40001":
|
|
51
|
+
self.pending_exception = SerializationConflictError(str(exc_val))
|
|
52
|
+
return True
|
|
53
|
+
self.pending_exception = create_mapped_exception(exc_val)
|
|
54
|
+
return True
|
|
55
|
+
return False
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
class CockroachAsyncpgDriver(AsyncpgDriver):
|
|
59
|
+
"""CockroachDB AsyncPG driver with retry support."""
|
|
60
|
+
|
|
61
|
+
__slots__ = ("_enable_retry", "_follower_staleness", "_retry_config")
|
|
62
|
+
dialect = "postgres"
|
|
63
|
+
|
|
64
|
+
def __init__(
|
|
65
|
+
self,
|
|
66
|
+
connection: "CockroachAsyncpgConnection",
|
|
67
|
+
statement_config: "StatementConfig | None" = None,
|
|
68
|
+
driver_features: "dict[str, Any] | None" = None,
|
|
69
|
+
) -> None:
|
|
70
|
+
super().__init__(connection=connection, statement_config=statement_config, driver_features=driver_features)
|
|
71
|
+
self._retry_config = CockroachAsyncpgRetryConfig.from_features(self.driver_features)
|
|
72
|
+
self._enable_retry = bool(self.driver_features.get("enable_auto_retry", True))
|
|
73
|
+
self._follower_staleness = cast("str | None", self.driver_features.get("default_staleness"))
|
|
74
|
+
# Data dictionary is lazily initialized in property; use parent slot
|
|
75
|
+
self._data_dictionary = None
|
|
76
|
+
|
|
77
|
+
async def _execute_with_retry(self, operation: "Callable[[], Any]") -> "ExecutionResult":
|
|
78
|
+
if not self._enable_retry:
|
|
79
|
+
return cast("ExecutionResult", await operation())
|
|
80
|
+
|
|
81
|
+
last_error: Exception | None = None
|
|
82
|
+
|
|
83
|
+
async def attempt_operation() -> "tuple[ExecutionResult | None, Exception | None]":
|
|
84
|
+
try:
|
|
85
|
+
return await operation(), None
|
|
86
|
+
except Exception as exc:
|
|
87
|
+
return None, exc
|
|
88
|
+
|
|
89
|
+
for attempt in range(self._retry_config.max_retries + 1):
|
|
90
|
+
result, exc = await attempt_operation()
|
|
91
|
+
if exc is None:
|
|
92
|
+
return cast("ExecutionResult", result)
|
|
93
|
+
last_error = exc
|
|
94
|
+
if not is_retryable_error(exc) or attempt >= self._retry_config.max_retries:
|
|
95
|
+
raise exc
|
|
96
|
+
with contextlib.suppress(Exception):
|
|
97
|
+
await self.connection.execute("ROLLBACK")
|
|
98
|
+
delay = calculate_backoff_seconds(attempt, self._retry_config)
|
|
99
|
+
if self._retry_config.enable_logging:
|
|
100
|
+
logger.debug("CockroachDB retry %s/%s after %.3fs", attempt + 1, self._retry_config.max_retries, delay)
|
|
101
|
+
await asyncio.sleep(delay)
|
|
102
|
+
|
|
103
|
+
msg = "CockroachDB transaction retry limit exceeded"
|
|
104
|
+
raise TransactionRetryError(msg) from last_error
|
|
105
|
+
|
|
106
|
+
async def _apply_follower_reads(self, cursor: "CockroachAsyncpgConnection") -> None:
|
|
107
|
+
if not self.driver_features.get("enable_follower_reads", False):
|
|
108
|
+
return
|
|
109
|
+
if not self._follower_staleness:
|
|
110
|
+
return
|
|
111
|
+
await cursor.execute(f"SET TRANSACTION AS OF SYSTEM TIME {self._follower_staleness}")
|
|
112
|
+
|
|
113
|
+
async def dispatch_execute(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
|
|
114
|
+
async def operation() -> "ExecutionResult":
|
|
115
|
+
if statement.returns_rows():
|
|
116
|
+
await self._apply_follower_reads(cursor)
|
|
117
|
+
return await super(CockroachAsyncpgDriver, self).dispatch_execute(cursor, statement)
|
|
118
|
+
|
|
119
|
+
return await self._execute_with_retry(operation)
|
|
120
|
+
|
|
121
|
+
async def dispatch_execute_many(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
|
|
122
|
+
async def operation() -> "ExecutionResult":
|
|
123
|
+
return await super(CockroachAsyncpgDriver, self).dispatch_execute_many(cursor, statement)
|
|
124
|
+
|
|
125
|
+
return await self._execute_with_retry(operation)
|
|
126
|
+
|
|
127
|
+
async def dispatch_execute_script(self, cursor: "CockroachAsyncpgConnection", statement: SQL) -> "ExecutionResult":
|
|
128
|
+
async def operation() -> "ExecutionResult":
|
|
129
|
+
return await super(CockroachAsyncpgDriver, self).dispatch_execute_script(cursor, statement)
|
|
130
|
+
|
|
131
|
+
return await self._execute_with_retry(operation)
|
|
132
|
+
|
|
133
|
+
def handle_database_exceptions(self) -> "CockroachAsyncpgExceptionHandler": # type: ignore[override]
|
|
134
|
+
return CockroachAsyncpgExceptionHandler()
|
|
135
|
+
|
|
136
|
+
@property
|
|
137
|
+
def data_dictionary(self) -> "CockroachAsyncpgDataDictionary": # type: ignore[override]
|
|
138
|
+
if self._data_dictionary is None:
|
|
139
|
+
# Intentionally assign CockroachDB-specific data dictionary to parent slot
|
|
140
|
+
object.__setattr__(self, "_data_dictionary", CockroachAsyncpgDataDictionary())
|
|
141
|
+
return cast("CockroachAsyncpgDataDictionary", self._data_dictionary)
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
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"
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"""CockroachDB session store for Litestar integration using asyncpg."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from sqlspec.extensions.litestar.store import BaseSQLSpecStore
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from sqlspec.adapters.cockroach_asyncpg.config import CockroachAsyncpgConfig
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
__all__ = ("CockroachAsyncpgStore",)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class CockroachAsyncpgStore(BaseSQLSpecStore["CockroachAsyncpgConfig"]):
|
|
16
|
+
"""CockroachDB session store using asyncpg driver."""
|
|
17
|
+
|
|
18
|
+
__slots__ = ()
|
|
19
|
+
|
|
20
|
+
def __init__(self, config: "CockroachAsyncpgConfig") -> None:
|
|
21
|
+
super().__init__(config)
|
|
22
|
+
|
|
23
|
+
def _get_create_table_sql(self) -> str:
|
|
24
|
+
"""Get CockroachDB CREATE TABLE SQL with optimized schema."""
|
|
25
|
+
return f"""
|
|
26
|
+
CREATE TABLE IF NOT EXISTS {self._table_name} (
|
|
27
|
+
session_id TEXT PRIMARY KEY,
|
|
28
|
+
data BYTEA NOT NULL,
|
|
29
|
+
expires_at TIMESTAMPTZ,
|
|
30
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
31
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
|
|
35
|
+
ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
|
|
36
|
+
"""
|
|
37
|
+
|
|
38
|
+
def _get_drop_table_sql(self) -> "list[str]":
|
|
39
|
+
return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
|
|
40
|
+
|
|
41
|
+
async def create_table(self) -> None:
|
|
42
|
+
sql = self._get_create_table_sql()
|
|
43
|
+
async with self._config.provide_session() as driver:
|
|
44
|
+
await driver.execute_script(sql)
|
|
45
|
+
self._log_table_created()
|
|
46
|
+
|
|
47
|
+
async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
|
|
48
|
+
sql = f"""
|
|
49
|
+
SELECT data, expires_at FROM {self._table_name}
|
|
50
|
+
WHERE session_id = $1
|
|
51
|
+
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
52
|
+
"""
|
|
53
|
+
|
|
54
|
+
async with self._config.provide_connection() as conn:
|
|
55
|
+
row = await conn.fetchrow(sql, key)
|
|
56
|
+
|
|
57
|
+
if row is None:
|
|
58
|
+
return None
|
|
59
|
+
|
|
60
|
+
if renew_for is not None and row["expires_at"] is not None:
|
|
61
|
+
new_expires_at = self._calculate_expires_at(renew_for)
|
|
62
|
+
if new_expires_at is not None:
|
|
63
|
+
update_sql = f"""
|
|
64
|
+
UPDATE {self._table_name}
|
|
65
|
+
SET expires_at = $1, updated_at = CURRENT_TIMESTAMP
|
|
66
|
+
WHERE session_id = $2
|
|
67
|
+
"""
|
|
68
|
+
await conn.execute(update_sql, new_expires_at, key)
|
|
69
|
+
|
|
70
|
+
return bytes(row["data"])
|
|
71
|
+
|
|
72
|
+
async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
|
|
73
|
+
data = self._value_to_bytes(value)
|
|
74
|
+
expires_at = self._calculate_expires_at(expires_in)
|
|
75
|
+
|
|
76
|
+
sql = f"""
|
|
77
|
+
INSERT INTO {self._table_name} (session_id, data, expires_at)
|
|
78
|
+
VALUES ($1, $2, $3)
|
|
79
|
+
ON CONFLICT (session_id)
|
|
80
|
+
DO UPDATE SET
|
|
81
|
+
data = EXCLUDED.data,
|
|
82
|
+
expires_at = EXCLUDED.expires_at,
|
|
83
|
+
updated_at = CURRENT_TIMESTAMP
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
async with self._config.provide_connection() as conn:
|
|
87
|
+
await conn.execute(sql, key, data, expires_at)
|
|
88
|
+
|
|
89
|
+
async def delete(self, key: str) -> None:
|
|
90
|
+
sql = f"DELETE FROM {self._table_name} WHERE session_id = $1"
|
|
91
|
+
|
|
92
|
+
async with self._config.provide_connection() as conn:
|
|
93
|
+
await conn.execute(sql, key)
|
|
94
|
+
|
|
95
|
+
async def delete_all(self) -> None:
|
|
96
|
+
sql = f"DELETE FROM {self._table_name}"
|
|
97
|
+
|
|
98
|
+
async with self._config.provide_connection() as conn:
|
|
99
|
+
await conn.execute(sql)
|
|
100
|
+
self._log_delete_all()
|
|
101
|
+
|
|
102
|
+
async def exists(self, key: str) -> bool:
|
|
103
|
+
sql = f"""
|
|
104
|
+
SELECT 1 FROM {self._table_name}
|
|
105
|
+
WHERE session_id = $1
|
|
106
|
+
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
107
|
+
"""
|
|
108
|
+
|
|
109
|
+
async with self._config.provide_connection() as conn:
|
|
110
|
+
row = await conn.fetchrow(sql, key)
|
|
111
|
+
return row is not None
|
|
112
|
+
|
|
113
|
+
async def expires_in(self, key: str) -> "int | None":
|
|
114
|
+
sql = f"""
|
|
115
|
+
SELECT expires_at FROM {self._table_name}
|
|
116
|
+
WHERE session_id = $1
|
|
117
|
+
"""
|
|
118
|
+
|
|
119
|
+
async with self._config.provide_connection() as conn:
|
|
120
|
+
row = await conn.fetchrow(sql, key)
|
|
121
|
+
|
|
122
|
+
if row is None or row["expires_at"] is None:
|
|
123
|
+
return None
|
|
124
|
+
|
|
125
|
+
expires_at = row["expires_at"]
|
|
126
|
+
now = datetime.now(timezone.utc)
|
|
127
|
+
|
|
128
|
+
if expires_at <= now:
|
|
129
|
+
return 0
|
|
130
|
+
|
|
131
|
+
delta = expires_at - now
|
|
132
|
+
return int(delta.total_seconds())
|
|
133
|
+
|
|
134
|
+
async def delete_expired(self) -> int:
|
|
135
|
+
sql = f"DELETE FROM {self._table_name} WHERE expires_at <= CURRENT_TIMESTAMP"
|
|
136
|
+
|
|
137
|
+
async with self._config.provide_connection() as conn:
|
|
138
|
+
result = await conn.execute(sql)
|
|
139
|
+
count = int(result.split()[-1]) if result else 0
|
|
140
|
+
if count > 0:
|
|
141
|
+
self._log_delete_expired(count)
|
|
142
|
+
return count
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from sqlspec.adapters.cockroach_psycopg._typing import (
|
|
2
|
+
CockroachAsyncConnection,
|
|
3
|
+
CockroachPsycopgAsyncSessionContext,
|
|
4
|
+
CockroachPsycopgSyncSessionContext,
|
|
5
|
+
CockroachSyncConnection,
|
|
6
|
+
)
|
|
7
|
+
from sqlspec.adapters.cockroach_psycopg.config import (
|
|
8
|
+
CockroachPsycopgAsyncConfig,
|
|
9
|
+
CockroachPsycopgConnectionConfig,
|
|
10
|
+
CockroachPsycopgDriverFeatures,
|
|
11
|
+
CockroachPsycopgPoolConfig,
|
|
12
|
+
CockroachPsycopgSyncConfig,
|
|
13
|
+
)
|
|
14
|
+
from sqlspec.adapters.cockroach_psycopg.core import build_statement_config, driver_profile
|
|
15
|
+
from sqlspec.adapters.cockroach_psycopg.driver import (
|
|
16
|
+
CockroachPsycopgAsyncDriver,
|
|
17
|
+
CockroachPsycopgAsyncExceptionHandler,
|
|
18
|
+
CockroachPsycopgSyncDriver,
|
|
19
|
+
CockroachPsycopgSyncExceptionHandler,
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
__all__ = (
|
|
23
|
+
"CockroachAsyncConnection",
|
|
24
|
+
"CockroachPsycopgAsyncConfig",
|
|
25
|
+
"CockroachPsycopgAsyncDriver",
|
|
26
|
+
"CockroachPsycopgAsyncExceptionHandler",
|
|
27
|
+
"CockroachPsycopgAsyncSessionContext",
|
|
28
|
+
"CockroachPsycopgConnectionConfig",
|
|
29
|
+
"CockroachPsycopgDriverFeatures",
|
|
30
|
+
"CockroachPsycopgPoolConfig",
|
|
31
|
+
"CockroachPsycopgSyncConfig",
|
|
32
|
+
"CockroachPsycopgSyncDriver",
|
|
33
|
+
"CockroachPsycopgSyncExceptionHandler",
|
|
34
|
+
"CockroachPsycopgSyncSessionContext",
|
|
35
|
+
"CockroachSyncConnection",
|
|
36
|
+
"build_statement_config",
|
|
37
|
+
"driver_profile",
|
|
38
|
+
)
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"""CockroachDB psycopg adapter type definitions.
|
|
2
|
+
|
|
3
|
+
This module contains type aliases and classes that are excluded from mypyc
|
|
4
|
+
compilation to avoid ABI boundary issues.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from typing import TYPE_CHECKING, Any
|
|
8
|
+
|
|
9
|
+
from psycopg import crdb as psycopg_crdb
|
|
10
|
+
from psycopg.rows import DictRow as PsycopgDictRow
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from collections.abc import Callable
|
|
14
|
+
from typing import TypeAlias
|
|
15
|
+
|
|
16
|
+
from psycopg.crdb import AsyncCrdbConnection, CrdbConnection
|
|
17
|
+
|
|
18
|
+
from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgAsyncDriver, CockroachPsycopgSyncDriver
|
|
19
|
+
from sqlspec.core import StatementConfig
|
|
20
|
+
|
|
21
|
+
# Parametrize with DictRow so type system knows rows are dict-like
|
|
22
|
+
CockroachSyncConnection: TypeAlias = CrdbConnection[PsycopgDictRow]
|
|
23
|
+
CockroachAsyncConnection: TypeAlias = AsyncCrdbConnection[PsycopgDictRow]
|
|
24
|
+
else:
|
|
25
|
+
CockroachSyncConnection = psycopg_crdb.CrdbConnection
|
|
26
|
+
CockroachAsyncConnection = psycopg_crdb.AsyncCrdbConnection
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class CockroachPsycopgSyncSessionContext:
|
|
30
|
+
"""Sync context manager for CockroachDB psycopg sessions."""
|
|
31
|
+
|
|
32
|
+
__slots__ = (
|
|
33
|
+
"_acquire_connection",
|
|
34
|
+
"_connection",
|
|
35
|
+
"_driver",
|
|
36
|
+
"_driver_features",
|
|
37
|
+
"_prepare_driver",
|
|
38
|
+
"_release_connection",
|
|
39
|
+
"_statement_config",
|
|
40
|
+
)
|
|
41
|
+
|
|
42
|
+
def __init__(
|
|
43
|
+
self,
|
|
44
|
+
acquire_connection: "Callable[[], Any]",
|
|
45
|
+
release_connection: "Callable[[Any], Any]",
|
|
46
|
+
statement_config: "StatementConfig",
|
|
47
|
+
driver_features: "dict[str, Any]",
|
|
48
|
+
prepare_driver: "Callable[[CockroachPsycopgSyncDriver], CockroachPsycopgSyncDriver]",
|
|
49
|
+
) -> None:
|
|
50
|
+
self._acquire_connection = acquire_connection
|
|
51
|
+
self._release_connection = release_connection
|
|
52
|
+
self._statement_config = statement_config
|
|
53
|
+
self._driver_features = driver_features
|
|
54
|
+
self._prepare_driver = prepare_driver
|
|
55
|
+
self._connection: Any = None
|
|
56
|
+
self._driver: CockroachPsycopgSyncDriver | None = None
|
|
57
|
+
|
|
58
|
+
def __enter__(self) -> "CockroachPsycopgSyncDriver":
|
|
59
|
+
from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgSyncDriver
|
|
60
|
+
|
|
61
|
+
self._connection = self._acquire_connection()
|
|
62
|
+
self._driver = CockroachPsycopgSyncDriver(
|
|
63
|
+
connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
|
|
64
|
+
)
|
|
65
|
+
return self._prepare_driver(self._driver)
|
|
66
|
+
|
|
67
|
+
def __exit__(
|
|
68
|
+
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
|
|
69
|
+
) -> "bool | None":
|
|
70
|
+
if self._connection is not None:
|
|
71
|
+
self._release_connection(self._connection)
|
|
72
|
+
self._connection = None
|
|
73
|
+
return None
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
class CockroachPsycopgAsyncSessionContext:
|
|
77
|
+
"""Async context manager for CockroachDB psycopg sessions."""
|
|
78
|
+
|
|
79
|
+
__slots__ = (
|
|
80
|
+
"_acquire_connection",
|
|
81
|
+
"_connection",
|
|
82
|
+
"_driver",
|
|
83
|
+
"_driver_features",
|
|
84
|
+
"_prepare_driver",
|
|
85
|
+
"_release_connection",
|
|
86
|
+
"_statement_config",
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
def __init__(
|
|
90
|
+
self,
|
|
91
|
+
acquire_connection: "Callable[[], Any]",
|
|
92
|
+
release_connection: "Callable[[Any], Any]",
|
|
93
|
+
statement_config: "StatementConfig",
|
|
94
|
+
driver_features: "dict[str, Any]",
|
|
95
|
+
prepare_driver: "Callable[[CockroachPsycopgAsyncDriver], CockroachPsycopgAsyncDriver]",
|
|
96
|
+
) -> None:
|
|
97
|
+
self._acquire_connection = acquire_connection
|
|
98
|
+
self._release_connection = release_connection
|
|
99
|
+
self._statement_config = statement_config
|
|
100
|
+
self._driver_features = driver_features
|
|
101
|
+
self._prepare_driver = prepare_driver
|
|
102
|
+
self._connection: Any = None
|
|
103
|
+
self._driver: CockroachPsycopgAsyncDriver | None = None
|
|
104
|
+
|
|
105
|
+
async def __aenter__(self) -> "CockroachPsycopgAsyncDriver":
|
|
106
|
+
from sqlspec.adapters.cockroach_psycopg.driver import CockroachPsycopgAsyncDriver
|
|
107
|
+
|
|
108
|
+
self._connection = await self._acquire_connection()
|
|
109
|
+
self._driver = CockroachPsycopgAsyncDriver(
|
|
110
|
+
connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
|
|
111
|
+
)
|
|
112
|
+
return self._prepare_driver(self._driver)
|
|
113
|
+
|
|
114
|
+
async def __aexit__(
|
|
115
|
+
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
|
|
116
|
+
) -> "bool | None":
|
|
117
|
+
if self._connection is not None:
|
|
118
|
+
await self._release_connection(self._connection)
|
|
119
|
+
self._connection = None
|
|
120
|
+
return None
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
__all__ = (
|
|
124
|
+
"CockroachAsyncConnection",
|
|
125
|
+
"CockroachPsycopgAsyncSessionContext",
|
|
126
|
+
"CockroachPsycopgSyncSessionContext",
|
|
127
|
+
"CockroachSyncConnection",
|
|
128
|
+
"PsycopgDictRow",
|
|
129
|
+
)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from sqlspec.adapters.cockroach_psycopg.adk.store import (
|
|
2
|
+
CockroachPsycopgAsyncADKMemoryStore,
|
|
3
|
+
CockroachPsycopgAsyncADKStore,
|
|
4
|
+
CockroachPsycopgSyncADKMemoryStore,
|
|
5
|
+
CockroachPsycopgSyncADKStore,
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
__all__ = (
|
|
9
|
+
"CockroachPsycopgAsyncADKMemoryStore",
|
|
10
|
+
"CockroachPsycopgAsyncADKStore",
|
|
11
|
+
"CockroachPsycopgSyncADKMemoryStore",
|
|
12
|
+
"CockroachPsycopgSyncADKStore",
|
|
13
|
+
)
|