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,325 @@
|
|
|
1
|
+
"""CockroachDB session stores for Litestar integration using psycopg."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
|
+
from typing import TYPE_CHECKING
|
|
5
|
+
|
|
6
|
+
from sqlspec.extensions.litestar.store import BaseSQLSpecStore
|
|
7
|
+
from sqlspec.utils.sync_tools import async_
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from sqlspec.adapters.cockroach_psycopg.config import CockroachPsycopgAsyncConfig, CockroachPsycopgSyncConfig
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
__all__ = ("CockroachPsycopgAsyncStore", "CockroachPsycopgSyncStore")
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class CockroachPsycopgAsyncStore(BaseSQLSpecStore["CockroachPsycopgAsyncConfig"]):
|
|
17
|
+
"""CockroachDB session store using psycopg async driver."""
|
|
18
|
+
|
|
19
|
+
__slots__ = ()
|
|
20
|
+
|
|
21
|
+
def __init__(self, config: "CockroachPsycopgAsyncConfig") -> None:
|
|
22
|
+
super().__init__(config)
|
|
23
|
+
|
|
24
|
+
def _get_create_table_sql(self) -> str:
|
|
25
|
+
"""Get CockroachDB CREATE TABLE SQL with optimized schema."""
|
|
26
|
+
return f"""
|
|
27
|
+
CREATE TABLE IF NOT EXISTS {self._table_name} (
|
|
28
|
+
session_id TEXT PRIMARY KEY,
|
|
29
|
+
data BYTEA NOT NULL,
|
|
30
|
+
expires_at TIMESTAMPTZ,
|
|
31
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
32
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
|
|
36
|
+
ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
|
|
37
|
+
"""
|
|
38
|
+
|
|
39
|
+
def _get_drop_table_sql(self) -> "list[str]":
|
|
40
|
+
return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
|
|
41
|
+
|
|
42
|
+
async def create_table(self) -> None:
|
|
43
|
+
sql = self._get_create_table_sql()
|
|
44
|
+
async with self._config.provide_session() as driver:
|
|
45
|
+
await driver.execute_script(sql)
|
|
46
|
+
await driver.commit()
|
|
47
|
+
self._log_table_created()
|
|
48
|
+
|
|
49
|
+
async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
|
|
50
|
+
sql = f"""
|
|
51
|
+
SELECT data, expires_at FROM {self._table_name}
|
|
52
|
+
WHERE session_id = %s
|
|
53
|
+
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
conn_context = self._config.provide_connection()
|
|
57
|
+
async with conn_context as conn:
|
|
58
|
+
async with conn.cursor() as cur:
|
|
59
|
+
await cur.execute(sql.encode(), (key,))
|
|
60
|
+
row = await cur.fetchone()
|
|
61
|
+
|
|
62
|
+
if row is None:
|
|
63
|
+
return None
|
|
64
|
+
|
|
65
|
+
if renew_for is not None and row["expires_at"] is not None:
|
|
66
|
+
new_expires_at = self._calculate_expires_at(renew_for)
|
|
67
|
+
if new_expires_at is not None:
|
|
68
|
+
update_sql = f"""
|
|
69
|
+
UPDATE {self._table_name}
|
|
70
|
+
SET expires_at = %s, updated_at = CURRENT_TIMESTAMP
|
|
71
|
+
WHERE session_id = %s
|
|
72
|
+
"""
|
|
73
|
+
await conn.execute(update_sql.encode(), (new_expires_at, key))
|
|
74
|
+
await conn.commit()
|
|
75
|
+
|
|
76
|
+
return bytes(row["data"])
|
|
77
|
+
|
|
78
|
+
async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
|
|
79
|
+
data = self._value_to_bytes(value)
|
|
80
|
+
expires_at = self._calculate_expires_at(expires_in)
|
|
81
|
+
|
|
82
|
+
sql = f"""
|
|
83
|
+
INSERT INTO {self._table_name} (session_id, data, expires_at)
|
|
84
|
+
VALUES (%s, %s, %s)
|
|
85
|
+
ON CONFLICT (session_id)
|
|
86
|
+
DO UPDATE SET
|
|
87
|
+
data = EXCLUDED.data,
|
|
88
|
+
expires_at = EXCLUDED.expires_at,
|
|
89
|
+
updated_at = CURRENT_TIMESTAMP
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
conn_context = self._config.provide_connection()
|
|
93
|
+
async with conn_context as conn:
|
|
94
|
+
await conn.execute(sql.encode(), (key, data, expires_at))
|
|
95
|
+
await conn.commit()
|
|
96
|
+
|
|
97
|
+
async def delete(self, key: str) -> None:
|
|
98
|
+
sql = f"DELETE FROM {self._table_name} WHERE session_id = %s"
|
|
99
|
+
|
|
100
|
+
conn_context = self._config.provide_connection()
|
|
101
|
+
async with conn_context as conn:
|
|
102
|
+
await conn.execute(sql.encode(), (key,))
|
|
103
|
+
await conn.commit()
|
|
104
|
+
|
|
105
|
+
async def delete_all(self) -> None:
|
|
106
|
+
sql = f"DELETE FROM {self._table_name}"
|
|
107
|
+
|
|
108
|
+
conn_context = self._config.provide_connection()
|
|
109
|
+
async with conn_context as conn:
|
|
110
|
+
await conn.execute(sql.encode())
|
|
111
|
+
await conn.commit()
|
|
112
|
+
self._log_delete_all()
|
|
113
|
+
|
|
114
|
+
async def exists(self, key: str) -> bool:
|
|
115
|
+
sql = f"""
|
|
116
|
+
SELECT 1 FROM {self._table_name}
|
|
117
|
+
WHERE session_id = %s
|
|
118
|
+
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
119
|
+
"""
|
|
120
|
+
|
|
121
|
+
conn_context = self._config.provide_connection()
|
|
122
|
+
async with conn_context as conn, conn.cursor() as cur:
|
|
123
|
+
await cur.execute(sql.encode(), (key,))
|
|
124
|
+
row = await cur.fetchone()
|
|
125
|
+
return row is not None
|
|
126
|
+
|
|
127
|
+
async def expires_in(self, key: str) -> "int | None":
|
|
128
|
+
sql = f"""
|
|
129
|
+
SELECT expires_at FROM {self._table_name}
|
|
130
|
+
WHERE session_id = %s
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
conn_context = self._config.provide_connection()
|
|
134
|
+
async with conn_context as conn:
|
|
135
|
+
async with conn.cursor() as cur:
|
|
136
|
+
await cur.execute(sql.encode(), (key,))
|
|
137
|
+
row = await cur.fetchone()
|
|
138
|
+
|
|
139
|
+
if row is None or row["expires_at"] is None:
|
|
140
|
+
return None
|
|
141
|
+
|
|
142
|
+
expires_at = row["expires_at"]
|
|
143
|
+
now = datetime.now(timezone.utc)
|
|
144
|
+
|
|
145
|
+
if expires_at <= now:
|
|
146
|
+
return 0
|
|
147
|
+
|
|
148
|
+
delta = expires_at - now
|
|
149
|
+
return int(delta.total_seconds())
|
|
150
|
+
|
|
151
|
+
async def delete_expired(self) -> int:
|
|
152
|
+
sql = f"DELETE FROM {self._table_name} WHERE expires_at <= CURRENT_TIMESTAMP"
|
|
153
|
+
|
|
154
|
+
conn_context = self._config.provide_connection()
|
|
155
|
+
async with conn_context as conn, conn.cursor() as cur:
|
|
156
|
+
await cur.execute(sql.encode())
|
|
157
|
+
await conn.commit()
|
|
158
|
+
count = cur.rowcount if cur.rowcount and cur.rowcount > 0 else 0
|
|
159
|
+
if count > 0:
|
|
160
|
+
self._log_delete_expired(count)
|
|
161
|
+
return count
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
class CockroachPsycopgSyncStore(BaseSQLSpecStore["CockroachPsycopgSyncConfig"]):
|
|
165
|
+
"""CockroachDB session store using psycopg sync driver."""
|
|
166
|
+
|
|
167
|
+
__slots__ = ()
|
|
168
|
+
|
|
169
|
+
def __init__(self, config: "CockroachPsycopgSyncConfig") -> None:
|
|
170
|
+
super().__init__(config)
|
|
171
|
+
|
|
172
|
+
def _get_create_table_sql(self) -> str:
|
|
173
|
+
return f"""
|
|
174
|
+
CREATE TABLE IF NOT EXISTS {self._table_name} (
|
|
175
|
+
session_id TEXT PRIMARY KEY,
|
|
176
|
+
data BYTEA NOT NULL,
|
|
177
|
+
expires_at TIMESTAMPTZ,
|
|
178
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
179
|
+
updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
180
|
+
);
|
|
181
|
+
|
|
182
|
+
CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
|
|
183
|
+
ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
|
|
184
|
+
"""
|
|
185
|
+
|
|
186
|
+
def _get_drop_table_sql(self) -> "list[str]":
|
|
187
|
+
return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
|
|
188
|
+
|
|
189
|
+
def _create_table(self) -> None:
|
|
190
|
+
sql = self._get_create_table_sql()
|
|
191
|
+
with self._config.provide_session() as driver:
|
|
192
|
+
driver.execute_script(sql)
|
|
193
|
+
driver.commit()
|
|
194
|
+
self._log_table_created()
|
|
195
|
+
|
|
196
|
+
async def create_table(self) -> None:
|
|
197
|
+
await async_(self._create_table)()
|
|
198
|
+
|
|
199
|
+
def _get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
|
|
200
|
+
sql = f"""
|
|
201
|
+
SELECT data, expires_at FROM {self._table_name}
|
|
202
|
+
WHERE session_id = %s
|
|
203
|
+
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
204
|
+
"""
|
|
205
|
+
|
|
206
|
+
with self._config.provide_connection() as conn:
|
|
207
|
+
with conn.cursor() as cur:
|
|
208
|
+
cur.execute(sql.encode(), (key,))
|
|
209
|
+
row = cur.fetchone()
|
|
210
|
+
|
|
211
|
+
if row is None:
|
|
212
|
+
return None
|
|
213
|
+
|
|
214
|
+
if renew_for is not None and row["expires_at"] is not None:
|
|
215
|
+
new_expires_at = self._calculate_expires_at(renew_for)
|
|
216
|
+
if new_expires_at is not None:
|
|
217
|
+
update_sql = f"""
|
|
218
|
+
UPDATE {self._table_name}
|
|
219
|
+
SET expires_at = %s, updated_at = CURRENT_TIMESTAMP
|
|
220
|
+
WHERE session_id = %s
|
|
221
|
+
"""
|
|
222
|
+
conn.execute(update_sql.encode(), (new_expires_at, key))
|
|
223
|
+
conn.commit()
|
|
224
|
+
|
|
225
|
+
return bytes(row["data"])
|
|
226
|
+
|
|
227
|
+
async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
|
|
228
|
+
return await async_(self._get)(key, renew_for)
|
|
229
|
+
|
|
230
|
+
def _set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
|
|
231
|
+
data = self._value_to_bytes(value)
|
|
232
|
+
expires_at = self._calculate_expires_at(expires_in)
|
|
233
|
+
|
|
234
|
+
sql = f"""
|
|
235
|
+
INSERT INTO {self._table_name} (session_id, data, expires_at)
|
|
236
|
+
VALUES (%s, %s, %s)
|
|
237
|
+
ON CONFLICT (session_id)
|
|
238
|
+
DO UPDATE SET
|
|
239
|
+
data = EXCLUDED.data,
|
|
240
|
+
expires_at = EXCLUDED.expires_at,
|
|
241
|
+
updated_at = CURRENT_TIMESTAMP
|
|
242
|
+
"""
|
|
243
|
+
|
|
244
|
+
with self._config.provide_connection() as conn:
|
|
245
|
+
conn.execute(sql.encode(), (key, data, expires_at))
|
|
246
|
+
conn.commit()
|
|
247
|
+
|
|
248
|
+
async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
|
|
249
|
+
await async_(self._set)(key, value, expires_in=expires_in)
|
|
250
|
+
|
|
251
|
+
def _delete(self, key: str) -> None:
|
|
252
|
+
sql = f"DELETE FROM {self._table_name} WHERE session_id = %s"
|
|
253
|
+
|
|
254
|
+
with self._config.provide_connection() as conn:
|
|
255
|
+
conn.execute(sql.encode(), (key,))
|
|
256
|
+
conn.commit()
|
|
257
|
+
|
|
258
|
+
async def delete(self, key: str) -> None:
|
|
259
|
+
await async_(self._delete)(key)
|
|
260
|
+
|
|
261
|
+
def _delete_all(self) -> None:
|
|
262
|
+
sql = f"DELETE FROM {self._table_name}"
|
|
263
|
+
|
|
264
|
+
with self._config.provide_connection() as conn:
|
|
265
|
+
conn.execute(sql.encode())
|
|
266
|
+
conn.commit()
|
|
267
|
+
self._log_delete_all()
|
|
268
|
+
|
|
269
|
+
async def delete_all(self) -> None:
|
|
270
|
+
await async_(self._delete_all)()
|
|
271
|
+
|
|
272
|
+
def _exists(self, key: str) -> bool:
|
|
273
|
+
sql = f"""
|
|
274
|
+
SELECT 1 FROM {self._table_name}
|
|
275
|
+
WHERE session_id = %s
|
|
276
|
+
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
|
|
277
|
+
"""
|
|
278
|
+
|
|
279
|
+
with self._config.provide_connection() as conn, conn.cursor() as cur:
|
|
280
|
+
cur.execute(sql.encode(), (key,))
|
|
281
|
+
row = cur.fetchone()
|
|
282
|
+
return row is not None
|
|
283
|
+
|
|
284
|
+
async def exists(self, key: str) -> bool:
|
|
285
|
+
return await async_(self._exists)(key)
|
|
286
|
+
|
|
287
|
+
def _expires_in(self, key: str) -> "int | None":
|
|
288
|
+
sql = f"""
|
|
289
|
+
SELECT expires_at FROM {self._table_name}
|
|
290
|
+
WHERE session_id = %s
|
|
291
|
+
"""
|
|
292
|
+
|
|
293
|
+
with self._config.provide_connection() as conn:
|
|
294
|
+
with conn.cursor() as cur:
|
|
295
|
+
cur.execute(sql.encode(), (key,))
|
|
296
|
+
row = cur.fetchone()
|
|
297
|
+
|
|
298
|
+
if row is None or row["expires_at"] is None:
|
|
299
|
+
return None
|
|
300
|
+
|
|
301
|
+
expires_at = row["expires_at"]
|
|
302
|
+
now = datetime.now(timezone.utc)
|
|
303
|
+
|
|
304
|
+
if expires_at <= now:
|
|
305
|
+
return 0
|
|
306
|
+
|
|
307
|
+
delta = expires_at - now
|
|
308
|
+
return int(delta.total_seconds())
|
|
309
|
+
|
|
310
|
+
async def expires_in(self, key: str) -> "int | None":
|
|
311
|
+
return await async_(self._expires_in)(key)
|
|
312
|
+
|
|
313
|
+
def _delete_expired(self) -> int:
|
|
314
|
+
sql = f"DELETE FROM {self._table_name} WHERE expires_at <= CURRENT_TIMESTAMP"
|
|
315
|
+
|
|
316
|
+
with self._config.provide_connection() as conn, conn.cursor() as cur:
|
|
317
|
+
cur.execute(sql.encode())
|
|
318
|
+
conn.commit()
|
|
319
|
+
count = cur.rowcount if cur.rowcount and cur.rowcount > 0 else 0
|
|
320
|
+
if count > 0:
|
|
321
|
+
self._log_delete_expired(count)
|
|
322
|
+
return count
|
|
323
|
+
|
|
324
|
+
async def delete_expired(self) -> int:
|
|
325
|
+
return await async_(self._delete_expired)()
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""DuckDB adapter for SQLSpec."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.duckdb._typing import DuckDBConnection
|
|
4
|
+
from sqlspec.adapters.duckdb.config import (
|
|
5
|
+
DuckDBConfig,
|
|
6
|
+
DuckDBConnectionParams,
|
|
7
|
+
DuckDBExtensionConfig,
|
|
8
|
+
DuckDBSecretConfig,
|
|
9
|
+
)
|
|
10
|
+
from sqlspec.adapters.duckdb.core import default_statement_config
|
|
11
|
+
from sqlspec.adapters.duckdb.driver import DuckDBCursor, DuckDBDriver, DuckDBExceptionHandler
|
|
12
|
+
from sqlspec.adapters.duckdb.pool import DuckDBConnectionPool
|
|
13
|
+
|
|
14
|
+
__all__ = (
|
|
15
|
+
"DuckDBConfig",
|
|
16
|
+
"DuckDBConnection",
|
|
17
|
+
"DuckDBConnectionParams",
|
|
18
|
+
"DuckDBConnectionPool",
|
|
19
|
+
"DuckDBCursor",
|
|
20
|
+
"DuckDBDriver",
|
|
21
|
+
"DuckDBExceptionHandler",
|
|
22
|
+
"DuckDBExtensionConfig",
|
|
23
|
+
"DuckDBSecretConfig",
|
|
24
|
+
"default_statement_config",
|
|
25
|
+
)
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"""DuckDB 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 duckdb import DuckDBPyConnection
|
|
10
|
+
|
|
11
|
+
_DuckDBConnection = DuckDBPyConnection
|
|
12
|
+
|
|
13
|
+
if TYPE_CHECKING:
|
|
14
|
+
from collections.abc import Callable
|
|
15
|
+
from typing import TypeAlias
|
|
16
|
+
|
|
17
|
+
from sqlspec.adapters.duckdb.driver import DuckDBDriver
|
|
18
|
+
from sqlspec.core import StatementConfig
|
|
19
|
+
|
|
20
|
+
DuckDBConnection: TypeAlias = _DuckDBConnection
|
|
21
|
+
|
|
22
|
+
if not TYPE_CHECKING:
|
|
23
|
+
DuckDBConnection = _DuckDBConnection
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
class DuckDBSessionContext:
|
|
27
|
+
"""Sync context manager for DuckDB sessions.
|
|
28
|
+
|
|
29
|
+
This class is intentionally excluded from mypyc compilation to avoid ABI
|
|
30
|
+
boundary issues. It receives callables from uncompiled config classes and
|
|
31
|
+
instantiates compiled Driver objects, acting as a bridge between compiled
|
|
32
|
+
and uncompiled code.
|
|
33
|
+
|
|
34
|
+
Uses callable-based connection management to decouple from config implementation.
|
|
35
|
+
"""
|
|
36
|
+
|
|
37
|
+
__slots__ = (
|
|
38
|
+
"_acquire_connection",
|
|
39
|
+
"_connection",
|
|
40
|
+
"_driver",
|
|
41
|
+
"_driver_features",
|
|
42
|
+
"_prepare_driver",
|
|
43
|
+
"_release_connection",
|
|
44
|
+
"_statement_config",
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
def __init__(
|
|
48
|
+
self,
|
|
49
|
+
acquire_connection: "Callable[[], Any]",
|
|
50
|
+
release_connection: "Callable[[Any], Any]",
|
|
51
|
+
statement_config: "StatementConfig",
|
|
52
|
+
driver_features: "dict[str, Any]",
|
|
53
|
+
prepare_driver: "Callable[[DuckDBDriver], DuckDBDriver]",
|
|
54
|
+
) -> None:
|
|
55
|
+
self._acquire_connection = acquire_connection
|
|
56
|
+
self._release_connection = release_connection
|
|
57
|
+
self._statement_config = statement_config
|
|
58
|
+
self._driver_features = driver_features
|
|
59
|
+
self._prepare_driver = prepare_driver
|
|
60
|
+
self._connection: Any = None
|
|
61
|
+
self._driver: DuckDBDriver | None = None
|
|
62
|
+
|
|
63
|
+
def __enter__(self) -> "DuckDBDriver":
|
|
64
|
+
from sqlspec.adapters.duckdb.driver import DuckDBDriver
|
|
65
|
+
|
|
66
|
+
self._connection = self._acquire_connection()
|
|
67
|
+
self._driver = DuckDBDriver(
|
|
68
|
+
connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
|
|
69
|
+
)
|
|
70
|
+
return self._prepare_driver(self._driver)
|
|
71
|
+
|
|
72
|
+
def __exit__(
|
|
73
|
+
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
|
|
74
|
+
) -> "bool | None":
|
|
75
|
+
if self._connection is not None:
|
|
76
|
+
self._release_connection(self._connection)
|
|
77
|
+
self._connection = None
|
|
78
|
+
return None
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
__all__ = ("DuckDBConnection", "DuckDBSessionContext")
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"""DuckDB ADK store for Google Agent Development Kit.
|
|
2
|
+
|
|
3
|
+
DuckDB is an OLAP database optimized for analytical queries. This adapter provides
|
|
4
|
+
embedded session storage with zero-configuration setup, excellent for development,
|
|
5
|
+
testing, and analytical workloads.
|
|
6
|
+
|
|
7
|
+
Notes:
|
|
8
|
+
For highly concurrent DML operations, consider PostgreSQL or other
|
|
9
|
+
OLTP-optimized databases.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from sqlspec.adapters.duckdb.adk.store import DuckdbADKMemoryStore, DuckdbADKStore
|
|
13
|
+
|
|
14
|
+
__all__ = ("DuckdbADKMemoryStore", "DuckdbADKStore")
|