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,296 @@
|
|
|
1
|
+
"""AsyncMy session store for Litestar integration."""
|
|
2
|
+
|
|
3
|
+
from datetime import datetime, timedelta, timezone
|
|
4
|
+
from typing import TYPE_CHECKING, Final
|
|
5
|
+
|
|
6
|
+
from sqlspec.extensions.litestar.store import BaseSQLSpecStore
|
|
7
|
+
from sqlspec.utils.logging import get_logger
|
|
8
|
+
|
|
9
|
+
if TYPE_CHECKING:
|
|
10
|
+
from sqlspec.adapters.asyncmy.config import AsyncmyConfig
|
|
11
|
+
|
|
12
|
+
logger = get_logger("sqlspec.adapters.asyncmy.litestar.store")
|
|
13
|
+
|
|
14
|
+
__all__ = ("AsyncmyStore",)
|
|
15
|
+
|
|
16
|
+
MYSQL_TABLE_NOT_FOUND_ERROR: Final = 1146
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class AsyncmyStore(BaseSQLSpecStore["AsyncmyConfig"]):
|
|
20
|
+
"""MySQL/MariaDB session store using AsyncMy driver.
|
|
21
|
+
|
|
22
|
+
Implements server-side session storage for Litestar using MySQL/MariaDB
|
|
23
|
+
via the AsyncMy driver. Provides efficient session management with:
|
|
24
|
+
- Native async MySQL operations
|
|
25
|
+
- UPSERT support using ON DUPLICATE KEY UPDATE
|
|
26
|
+
- Automatic expiration handling
|
|
27
|
+
- Efficient cleanup of expired sessions
|
|
28
|
+
- Timezone-aware expiration (stored as UTC in DATETIME)
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
config: AsyncmyConfig instance.
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
from sqlspec.adapters.asyncmy import AsyncmyConfig
|
|
35
|
+
from sqlspec.adapters.asyncmy.litestar.store import AsyncmyStore
|
|
36
|
+
|
|
37
|
+
config = AsyncmyConfig(connection_config={"host": "localhost", ...})
|
|
38
|
+
store = AsyncmyStore(config)
|
|
39
|
+
await store.create_table()
|
|
40
|
+
|
|
41
|
+
Notes:
|
|
42
|
+
MySQL DATETIME is timezone-naive, so UTC datetimes are stored without
|
|
43
|
+
timezone info and timezone conversion is handled in Python layer.
|
|
44
|
+
"""
|
|
45
|
+
|
|
46
|
+
__slots__ = ()
|
|
47
|
+
|
|
48
|
+
def __init__(self, config: "AsyncmyConfig") -> None:
|
|
49
|
+
"""Initialize AsyncMy session store.
|
|
50
|
+
|
|
51
|
+
Args:
|
|
52
|
+
config: AsyncmyConfig instance.
|
|
53
|
+
|
|
54
|
+
Notes:
|
|
55
|
+
Table name is read from config.extension_config["litestar"]["session_table"].
|
|
56
|
+
"""
|
|
57
|
+
super().__init__(config)
|
|
58
|
+
|
|
59
|
+
def _get_create_table_sql(self) -> str:
|
|
60
|
+
"""Get MySQL CREATE TABLE SQL with optimized schema.
|
|
61
|
+
|
|
62
|
+
Returns:
|
|
63
|
+
SQL statement to create the sessions table with proper indexes.
|
|
64
|
+
|
|
65
|
+
Notes:
|
|
66
|
+
- Uses DATETIME(6) for microsecond precision timestamps
|
|
67
|
+
- MySQL doesn't have TIMESTAMPTZ, so we store UTC as timezone-naive
|
|
68
|
+
- LONGBLOB for large session data support (up to 4GB)
|
|
69
|
+
- InnoDB engine for ACID compliance and proper transaction support
|
|
70
|
+
- UTF8MB4 for full Unicode support (including emoji)
|
|
71
|
+
- Index on expires_at for efficient cleanup queries
|
|
72
|
+
- Auto-update of updated_at timestamp on row modification
|
|
73
|
+
- Table name is internally controlled, not user input (S608 suppressed)
|
|
74
|
+
"""
|
|
75
|
+
return f"""
|
|
76
|
+
CREATE TABLE IF NOT EXISTS {self._table_name} (
|
|
77
|
+
session_id VARCHAR(255) PRIMARY KEY,
|
|
78
|
+
data LONGBLOB NOT NULL,
|
|
79
|
+
expires_at DATETIME(6),
|
|
80
|
+
created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),
|
|
81
|
+
updated_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
|
|
82
|
+
INDEX idx_{self._table_name}_expires_at (expires_at)
|
|
83
|
+
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
|
|
84
|
+
"""
|
|
85
|
+
|
|
86
|
+
def _get_drop_table_sql(self) -> "list[str]":
|
|
87
|
+
"""Get MySQL/MariaDB DROP TABLE SQL statements.
|
|
88
|
+
|
|
89
|
+
Returns:
|
|
90
|
+
List of SQL statements to drop indexes and table.
|
|
91
|
+
"""
|
|
92
|
+
return [
|
|
93
|
+
f"DROP INDEX idx_{self._table_name}_expires_at ON {self._table_name}",
|
|
94
|
+
f"DROP TABLE IF EXISTS {self._table_name}",
|
|
95
|
+
]
|
|
96
|
+
|
|
97
|
+
async def create_table(self) -> None:
|
|
98
|
+
"""Create the session table if it doesn't exist."""
|
|
99
|
+
sql = self._get_create_table_sql()
|
|
100
|
+
async with self._config.provide_session() as driver:
|
|
101
|
+
await driver.execute_script(sql)
|
|
102
|
+
self._log_table_created()
|
|
103
|
+
|
|
104
|
+
async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
|
|
105
|
+
"""Get a session value by key.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
key: Session ID to retrieve.
|
|
109
|
+
renew_for: If given, renew the expiry time for this duration.
|
|
110
|
+
|
|
111
|
+
Returns:
|
|
112
|
+
Session data as bytes if found and not expired, None otherwise.
|
|
113
|
+
|
|
114
|
+
Notes:
|
|
115
|
+
Uses UTC_TIMESTAMP(6) for microsecond precision current time in MySQL.
|
|
116
|
+
Compares expires_at as UTC datetime (timezone-naive in MySQL).
|
|
117
|
+
"""
|
|
118
|
+
import asyncmy
|
|
119
|
+
|
|
120
|
+
sql = f"""
|
|
121
|
+
SELECT data, expires_at FROM {self._table_name}
|
|
122
|
+
WHERE session_id = %s
|
|
123
|
+
AND (expires_at IS NULL OR expires_at > UTC_TIMESTAMP(6))
|
|
124
|
+
"""
|
|
125
|
+
|
|
126
|
+
try:
|
|
127
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
128
|
+
await cursor.execute(sql, (key,))
|
|
129
|
+
row = await cursor.fetchone()
|
|
130
|
+
|
|
131
|
+
if row is None:
|
|
132
|
+
return None
|
|
133
|
+
|
|
134
|
+
data_value, expires_at = row
|
|
135
|
+
|
|
136
|
+
if renew_for is not None and expires_at is not None:
|
|
137
|
+
new_expires_at = self._calculate_expires_at(renew_for)
|
|
138
|
+
if new_expires_at is not None:
|
|
139
|
+
naive_expires_at = new_expires_at.replace(tzinfo=None)
|
|
140
|
+
update_sql = f"""
|
|
141
|
+
UPDATE {self._table_name}
|
|
142
|
+
SET expires_at = %s, updated_at = UTC_TIMESTAMP(6)
|
|
143
|
+
WHERE session_id = %s
|
|
144
|
+
"""
|
|
145
|
+
await cursor.execute(update_sql, (naive_expires_at, key))
|
|
146
|
+
await conn.commit()
|
|
147
|
+
|
|
148
|
+
return bytes(data_value)
|
|
149
|
+
except asyncmy.errors.ProgrammingError as e: # pyright: ignore
|
|
150
|
+
if "doesn't exist" in str(e) or e.args[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
|
|
151
|
+
return None
|
|
152
|
+
raise
|
|
153
|
+
|
|
154
|
+
async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
|
|
155
|
+
"""Store a session value.
|
|
156
|
+
|
|
157
|
+
Args:
|
|
158
|
+
key: Session ID.
|
|
159
|
+
value: Session data.
|
|
160
|
+
expires_in: Time until expiration.
|
|
161
|
+
|
|
162
|
+
Notes:
|
|
163
|
+
Uses INSERT ... ON DUPLICATE KEY UPDATE for efficient UPSERT.
|
|
164
|
+
Stores UTC datetime as timezone-naive DATETIME in MySQL.
|
|
165
|
+
Uses alias syntax (AS new) instead of deprecated VALUES() function.
|
|
166
|
+
"""
|
|
167
|
+
data = self._value_to_bytes(value)
|
|
168
|
+
expires_at = self._calculate_expires_at(expires_in)
|
|
169
|
+
naive_expires_at = expires_at.replace(tzinfo=None) if expires_at else None
|
|
170
|
+
|
|
171
|
+
sql = f"""
|
|
172
|
+
INSERT INTO {self._table_name} (session_id, data, expires_at)
|
|
173
|
+
VALUES (%s, %s, %s) AS new
|
|
174
|
+
ON DUPLICATE KEY UPDATE
|
|
175
|
+
data = new.data,
|
|
176
|
+
expires_at = new.expires_at,
|
|
177
|
+
updated_at = UTC_TIMESTAMP(6)
|
|
178
|
+
"""
|
|
179
|
+
|
|
180
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
181
|
+
await cursor.execute(sql, (key, data, naive_expires_at))
|
|
182
|
+
await conn.commit()
|
|
183
|
+
|
|
184
|
+
async def delete(self, key: str) -> None:
|
|
185
|
+
"""Delete a session by key.
|
|
186
|
+
|
|
187
|
+
Args:
|
|
188
|
+
key: Session ID to delete.
|
|
189
|
+
"""
|
|
190
|
+
sql = f"DELETE FROM {self._table_name} WHERE session_id = %s"
|
|
191
|
+
|
|
192
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
193
|
+
await cursor.execute(sql, (key,))
|
|
194
|
+
await conn.commit()
|
|
195
|
+
|
|
196
|
+
async def delete_all(self) -> None:
|
|
197
|
+
"""Delete all sessions from the store."""
|
|
198
|
+
import asyncmy
|
|
199
|
+
|
|
200
|
+
sql = f"DELETE FROM {self._table_name}"
|
|
201
|
+
|
|
202
|
+
try:
|
|
203
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
204
|
+
await cursor.execute(sql)
|
|
205
|
+
await conn.commit()
|
|
206
|
+
self._log_delete_all()
|
|
207
|
+
except asyncmy.errors.ProgrammingError as e: # pyright: ignore
|
|
208
|
+
if "doesn't exist" in str(e) or e.args[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
|
|
209
|
+
logger.debug("Table %s does not exist, skipping delete_all", self._table_name)
|
|
210
|
+
return
|
|
211
|
+
raise
|
|
212
|
+
|
|
213
|
+
async def exists(self, key: str) -> bool:
|
|
214
|
+
"""Check if a session key exists and is not expired.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
key: Session ID to check.
|
|
218
|
+
|
|
219
|
+
Returns:
|
|
220
|
+
True if the session exists and is not expired.
|
|
221
|
+
|
|
222
|
+
Notes:
|
|
223
|
+
Uses UTC_TIMESTAMP(6) for microsecond precision current time comparison.
|
|
224
|
+
"""
|
|
225
|
+
import asyncmy
|
|
226
|
+
|
|
227
|
+
sql = f"""
|
|
228
|
+
SELECT 1 FROM {self._table_name}
|
|
229
|
+
WHERE session_id = %s
|
|
230
|
+
AND (expires_at IS NULL OR expires_at > UTC_TIMESTAMP(6))
|
|
231
|
+
"""
|
|
232
|
+
|
|
233
|
+
try:
|
|
234
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
235
|
+
await cursor.execute(sql, (key,))
|
|
236
|
+
result = await cursor.fetchone()
|
|
237
|
+
return result is not None
|
|
238
|
+
except asyncmy.errors.ProgrammingError as e: # pyright: ignore
|
|
239
|
+
if "doesn't exist" in str(e) or e.args[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
|
|
240
|
+
return False
|
|
241
|
+
raise
|
|
242
|
+
|
|
243
|
+
async def expires_in(self, key: str) -> "int | None":
|
|
244
|
+
"""Get the time in seconds until the session expires.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
key: Session ID to check.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
Seconds until expiration, or None if no expiry or key doesn't exist.
|
|
251
|
+
|
|
252
|
+
Notes:
|
|
253
|
+
MySQL DATETIME is timezone-naive, but we treat it as UTC.
|
|
254
|
+
Compare against UTC now in Python layer for accuracy.
|
|
255
|
+
"""
|
|
256
|
+
sql = f"""
|
|
257
|
+
SELECT expires_at FROM {self._table_name}
|
|
258
|
+
WHERE session_id = %s
|
|
259
|
+
"""
|
|
260
|
+
|
|
261
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
262
|
+
await cursor.execute(sql, (key,))
|
|
263
|
+
row = await cursor.fetchone()
|
|
264
|
+
|
|
265
|
+
if row is None or row[0] is None:
|
|
266
|
+
return None
|
|
267
|
+
|
|
268
|
+
expires_at_naive = row[0]
|
|
269
|
+
expires_at_utc = expires_at_naive.replace(tzinfo=timezone.utc)
|
|
270
|
+
now = datetime.now(timezone.utc)
|
|
271
|
+
|
|
272
|
+
if expires_at_utc <= now:
|
|
273
|
+
return 0
|
|
274
|
+
|
|
275
|
+
delta = expires_at_utc - now
|
|
276
|
+
return int(delta.total_seconds())
|
|
277
|
+
|
|
278
|
+
async def delete_expired(self) -> int:
|
|
279
|
+
"""Delete all expired sessions.
|
|
280
|
+
|
|
281
|
+
Returns:
|
|
282
|
+
Number of sessions deleted.
|
|
283
|
+
|
|
284
|
+
Notes:
|
|
285
|
+
Uses UTC_TIMESTAMP(6) for microsecond precision current time comparison.
|
|
286
|
+
ROW_COUNT() returns the number of affected rows.
|
|
287
|
+
"""
|
|
288
|
+
sql = f"DELETE FROM {self._table_name} WHERE expires_at <= UTC_TIMESTAMP(6)"
|
|
289
|
+
|
|
290
|
+
async with self._config.provide_connection() as conn, conn.cursor() as cursor:
|
|
291
|
+
await cursor.execute(sql)
|
|
292
|
+
await conn.commit()
|
|
293
|
+
count: int = cursor.rowcount
|
|
294
|
+
if count > 0:
|
|
295
|
+
self._log_delete_expired(count)
|
|
296
|
+
return count
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""AsyncPG adapter for SQLSpec."""
|
|
2
|
+
|
|
3
|
+
from sqlspec.adapters.asyncpg._typing import AsyncpgConnection, AsyncpgPool, AsyncpgPreparedStatement
|
|
4
|
+
from sqlspec.adapters.asyncpg.config import AsyncpgConfig, AsyncpgConnectionConfig, AsyncpgPoolConfig
|
|
5
|
+
from sqlspec.adapters.asyncpg.core import default_statement_config
|
|
6
|
+
from sqlspec.adapters.asyncpg.driver import AsyncpgCursor, AsyncpgDriver, AsyncpgExceptionHandler
|
|
7
|
+
|
|
8
|
+
__all__ = (
|
|
9
|
+
"AsyncpgConfig",
|
|
10
|
+
"AsyncpgConnection",
|
|
11
|
+
"AsyncpgConnectionConfig",
|
|
12
|
+
"AsyncpgCursor",
|
|
13
|
+
"AsyncpgDriver",
|
|
14
|
+
"AsyncpgExceptionHandler",
|
|
15
|
+
"AsyncpgPool",
|
|
16
|
+
"AsyncpgPoolConfig",
|
|
17
|
+
"AsyncpgPreparedStatement",
|
|
18
|
+
"default_statement_config",
|
|
19
|
+
)
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"""AsyncPG 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 asyncpg.pool import PoolConnectionProxy
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from collections.abc import Callable
|
|
13
|
+
from typing import TypeAlias
|
|
14
|
+
|
|
15
|
+
from asyncpg import Connection, Pool, Record
|
|
16
|
+
from asyncpg.prepared_stmt import PreparedStatement
|
|
17
|
+
|
|
18
|
+
from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
|
|
19
|
+
from sqlspec.core import StatementConfig
|
|
20
|
+
|
|
21
|
+
AsyncpgConnection: TypeAlias = Connection[Record] | PoolConnectionProxy[Record]
|
|
22
|
+
AsyncpgPool: TypeAlias = Pool[Record]
|
|
23
|
+
AsyncpgPreparedStatement: TypeAlias = PreparedStatement[Record]
|
|
24
|
+
else:
|
|
25
|
+
from asyncpg import Pool
|
|
26
|
+
from asyncpg.prepared_stmt import PreparedStatement
|
|
27
|
+
|
|
28
|
+
AsyncpgConnection = PoolConnectionProxy
|
|
29
|
+
AsyncpgPool = Pool
|
|
30
|
+
AsyncpgPreparedStatement = PreparedStatement
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class AsyncpgSessionContext:
|
|
34
|
+
"""Async context manager for AsyncPG sessions.
|
|
35
|
+
|
|
36
|
+
This class is intentionally excluded from mypyc compilation to avoid ABI
|
|
37
|
+
boundary issues. It receives callables from uncompiled config classes and
|
|
38
|
+
instantiates compiled Driver objects, acting as a bridge between compiled
|
|
39
|
+
and uncompiled code.
|
|
40
|
+
|
|
41
|
+
Uses callable-based connection management to decouple from config implementation.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
__slots__ = (
|
|
45
|
+
"_acquire_connection",
|
|
46
|
+
"_connection",
|
|
47
|
+
"_driver",
|
|
48
|
+
"_driver_features",
|
|
49
|
+
"_prepare_driver",
|
|
50
|
+
"_release_connection",
|
|
51
|
+
"_statement_config",
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
def __init__(
|
|
55
|
+
self,
|
|
56
|
+
acquire_connection: "Callable[[], Any]",
|
|
57
|
+
release_connection: "Callable[[Any], Any]",
|
|
58
|
+
statement_config: "StatementConfig",
|
|
59
|
+
driver_features: "dict[str, Any]",
|
|
60
|
+
prepare_driver: "Callable[[AsyncpgDriver], AsyncpgDriver]",
|
|
61
|
+
) -> None:
|
|
62
|
+
self._acquire_connection = acquire_connection
|
|
63
|
+
self._release_connection = release_connection
|
|
64
|
+
self._statement_config = statement_config
|
|
65
|
+
self._driver_features = driver_features
|
|
66
|
+
self._prepare_driver = prepare_driver
|
|
67
|
+
self._connection: Any = None
|
|
68
|
+
self._driver: AsyncpgDriver | None = None
|
|
69
|
+
|
|
70
|
+
async def __aenter__(self) -> "AsyncpgDriver":
|
|
71
|
+
from sqlspec.adapters.asyncpg.driver import AsyncpgDriver
|
|
72
|
+
|
|
73
|
+
self._connection = await self._acquire_connection()
|
|
74
|
+
self._driver = AsyncpgDriver(
|
|
75
|
+
connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
|
|
76
|
+
)
|
|
77
|
+
return self._prepare_driver(self._driver)
|
|
78
|
+
|
|
79
|
+
async def __aexit__(
|
|
80
|
+
self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
|
|
81
|
+
) -> "bool | None":
|
|
82
|
+
if self._connection is not None:
|
|
83
|
+
await self._release_connection(self._connection)
|
|
84
|
+
self._connection = None
|
|
85
|
+
return None
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
__all__ = ("AsyncpgConnection", "AsyncpgPool", "AsyncpgPreparedStatement", "AsyncpgSessionContext")
|