sqlspec 0.47.0__cp314-cp314-win_amd64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
- sqlspec/__init__.py +167 -0
- sqlspec/__main__.py +12 -0
- sqlspec/__metadata__.py +14 -0
- sqlspec/_typing.py +714 -0
- sqlspec/adapters/__init__.py +0 -0
- sqlspec/adapters/adbc/__init__.py +13 -0
- sqlspec/adapters/adbc/_typing.py +106 -0
- sqlspec/adapters/adbc/adk/__init__.py +5 -0
- sqlspec/adapters/adbc/adk/store.py +1280 -0
- sqlspec/adapters/adbc/config.py +378 -0
- sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/core.py +922 -0
- sqlspec/adapters/adbc/data_dictionary.py +339 -0
- sqlspec/adapters/adbc/driver.py +534 -0
- sqlspec/adapters/adbc/events/__init__.py +5 -0
- sqlspec/adapters/adbc/events/store.py +285 -0
- sqlspec/adapters/adbc/litestar/__init__.py +5 -0
- sqlspec/adapters/adbc/litestar/store.py +534 -0
- sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/adbc/type_converter.py +142 -0
- sqlspec/adapters/aiomysql/__init__.py +21 -0
- sqlspec/adapters/aiomysql/_typing.py +137 -0
- sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
- sqlspec/adapters/aiomysql/adk/store.py +678 -0
- sqlspec/adapters/aiomysql/config.py +305 -0
- sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiomysql/core.py +536 -0
- sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
- sqlspec/adapters/aiomysql/driver.py +386 -0
- sqlspec/adapters/aiomysql/events/__init__.py +5 -0
- sqlspec/adapters/aiomysql/events/store.py +104 -0
- sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
- sqlspec/adapters/aiomysql/litestar/store.py +314 -0
- sqlspec/adapters/aiosqlite/__init__.py +26 -0
- sqlspec/adapters/aiosqlite/_typing.py +109 -0
- sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/adk/store.py +829 -0
- sqlspec/adapters/aiosqlite/config.py +315 -0
- sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/core.py +315 -0
- sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
- sqlspec/adapters/aiosqlite/driver.py +311 -0
- sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/events/store.py +20 -0
- sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
- sqlspec/adapters/aiosqlite/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/aiosqlite/pool.py +734 -0
- sqlspec/adapters/asyncmy/__init__.py +21 -0
- sqlspec/adapters/asyncmy/_typing.py +113 -0
- sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
- sqlspec/adapters/asyncmy/adk/store.py +644 -0
- sqlspec/adapters/asyncmy/config.py +307 -0
- sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncmy/core.py +538 -0
- sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
- sqlspec/adapters/asyncmy/driver.py +391 -0
- sqlspec/adapters/asyncmy/events/__init__.py +5 -0
- sqlspec/adapters/asyncmy/events/store.py +104 -0
- sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncmy/litestar/store.py +296 -0
- sqlspec/adapters/asyncpg/__init__.py +26 -0
- sqlspec/adapters/asyncpg/_typing.py +103 -0
- sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
- sqlspec/adapters/asyncpg/adk/store.py +483 -0
- sqlspec/adapters/asyncpg/config.py +575 -0
- sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/asyncpg/core.py +480 -0
- sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
- sqlspec/adapters/asyncpg/driver.py +487 -0
- sqlspec/adapters/asyncpg/events/__init__.py +6 -0
- sqlspec/adapters/asyncpg/events/_hub.py +181 -0
- sqlspec/adapters/asyncpg/events/backend.py +210 -0
- sqlspec/adapters/asyncpg/events/store.py +40 -0
- sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
- sqlspec/adapters/asyncpg/litestar/store.py +251 -0
- sqlspec/adapters/bigquery/__init__.py +15 -0
- sqlspec/adapters/bigquery/_typing.py +108 -0
- sqlspec/adapters/bigquery/config.py +362 -0
- sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/core.py +768 -0
- sqlspec/adapters/bigquery/data_dictionary.py +120 -0
- sqlspec/adapters/bigquery/driver.py +542 -0
- sqlspec/adapters/bigquery/events/__init__.py +5 -0
- sqlspec/adapters/bigquery/events/store.py +139 -0
- sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
- sqlspec/adapters/bigquery/litestar/store.py +325 -0
- sqlspec/adapters/bigquery/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/bigquery/type_converter.py +107 -0
- sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
- sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
- sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
- sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
- sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
- sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
- sqlspec/adapters/cockroach_asyncpg/driver.py +142 -0
- sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
- sqlspec/adapters/cockroach_psycopg/__init__.py +39 -0
- sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
- sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
- sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
- sqlspec/adapters/cockroach_psycopg/config.py +511 -0
- sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/cockroach_psycopg/core.py +63 -0
- sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
- sqlspec/adapters/cockroach_psycopg/driver.py +273 -0
- sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
- sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
- sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
- sqlspec/adapters/cockroach_psycopg/litestar/store.py +327 -0
- sqlspec/adapters/duckdb/__init__.py +29 -0
- sqlspec/adapters/duckdb/_typing.py +104 -0
- sqlspec/adapters/duckdb/adk/__init__.py +14 -0
- sqlspec/adapters/duckdb/adk/store.py +935 -0
- sqlspec/adapters/duckdb/config.py +386 -0
- sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/core.py +332 -0
- sqlspec/adapters/duckdb/data_dictionary.py +140 -0
- sqlspec/adapters/duckdb/driver.py +426 -0
- sqlspec/adapters/duckdb/events/__init__.py +5 -0
- sqlspec/adapters/duckdb/events/store.py +57 -0
- sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
- sqlspec/adapters/duckdb/litestar/store.py +330 -0
- sqlspec/adapters/duckdb/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/pool.py +350 -0
- sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/duckdb/type_converter.py +118 -0
- sqlspec/adapters/mysqlconnector/__init__.py +39 -0
- sqlspec/adapters/mysqlconnector/_typing.py +186 -0
- sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
- sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
- sqlspec/adapters/mysqlconnector/config.py +421 -0
- sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/mysqlconnector/core.py +472 -0
- sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
- sqlspec/adapters/mysqlconnector/driver.py +516 -0
- sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
- sqlspec/adapters/mysqlconnector/events/store.py +98 -0
- sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
- sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
- sqlspec/adapters/oracledb/__init__.py +39 -0
- sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_json_handlers.py +196 -0
- sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_param_types.py +46 -0
- sqlspec/adapters/oracledb/_typing.py +258 -0
- sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
- sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
- sqlspec/adapters/oracledb/adk/__init__.py +21 -0
- sqlspec/adapters/oracledb/adk/store.py +2453 -0
- sqlspec/adapters/oracledb/config.py +575 -0
- sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/core.py +820 -0
- sqlspec/adapters/oracledb/data_dictionary.py +404 -0
- sqlspec/adapters/oracledb/driver.py +1277 -0
- sqlspec/adapters/oracledb/events/__init__.py +16 -0
- sqlspec/adapters/oracledb/events/_hub.py +345 -0
- sqlspec/adapters/oracledb/events/backend.py +300 -0
- sqlspec/adapters/oracledb/events/store.py +420 -0
- sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
- sqlspec/adapters/oracledb/litestar/store.py +781 -0
- sqlspec/adapters/oracledb/migrations.py +539 -0
- sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/oracledb/type_converter.py +211 -0
- sqlspec/adapters/psqlpy/__init__.py +18 -0
- sqlspec/adapters/psqlpy/_typing.py +121 -0
- sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
- sqlspec/adapters/psqlpy/adk/store.py +591 -0
- sqlspec/adapters/psqlpy/config.py +376 -0
- sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/core.py +694 -0
- sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
- sqlspec/adapters/psqlpy/driver.py +411 -0
- sqlspec/adapters/psqlpy/events/__init__.py +6 -0
- sqlspec/adapters/psqlpy/events/_hub.py +204 -0
- sqlspec/adapters/psqlpy/events/backend.py +210 -0
- sqlspec/adapters/psqlpy/events/store.py +20 -0
- sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
- sqlspec/adapters/psqlpy/litestar/store.py +270 -0
- sqlspec/adapters/psqlpy/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psqlpy/type_converter.py +113 -0
- sqlspec/adapters/psycopg/__init__.py +38 -0
- sqlspec/adapters/psycopg/_typing.py +218 -0
- sqlspec/adapters/psycopg/adk/__init__.py +10 -0
- sqlspec/adapters/psycopg/adk/store.py +1106 -0
- sqlspec/adapters/psycopg/config.py +695 -0
- sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/core.py +520 -0
- sqlspec/adapters/psycopg/data_dictionary.py +278 -0
- sqlspec/adapters/psycopg/driver.py +1033 -0
- sqlspec/adapters/psycopg/events/__init__.py +20 -0
- sqlspec/adapters/psycopg/events/_hub.py +388 -0
- sqlspec/adapters/psycopg/events/backend.py +398 -0
- sqlspec/adapters/psycopg/events/store.py +42 -0
- sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
- sqlspec/adapters/psycopg/litestar/store.py +554 -0
- sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/psycopg/type_converter.py +93 -0
- sqlspec/adapters/pymysql/__init__.py +21 -0
- sqlspec/adapters/pymysql/_typing.py +92 -0
- sqlspec/adapters/pymysql/adk/__init__.py +5 -0
- sqlspec/adapters/pymysql/adk/store.py +657 -0
- sqlspec/adapters/pymysql/config.py +176 -0
- sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/core.py +469 -0
- sqlspec/adapters/pymysql/data_dictionary.py +120 -0
- sqlspec/adapters/pymysql/driver.py +271 -0
- sqlspec/adapters/pymysql/events/__init__.py +5 -0
- sqlspec/adapters/pymysql/events/store.py +50 -0
- sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
- sqlspec/adapters/pymysql/litestar/store.py +232 -0
- sqlspec/adapters/pymysql/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/pymysql/pool.py +184 -0
- sqlspec/adapters/spanner/__init__.py +33 -0
- sqlspec/adapters/spanner/_typing.py +102 -0
- sqlspec/adapters/spanner/adk/__init__.py +5 -0
- sqlspec/adapters/spanner/adk/store.py +758 -0
- sqlspec/adapters/spanner/config.py +355 -0
- sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/core.py +263 -0
- sqlspec/adapters/spanner/data_dictionary.py +120 -0
- sqlspec/adapters/spanner/driver.py +407 -0
- sqlspec/adapters/spanner/events/__init__.py +5 -0
- sqlspec/adapters/spanner/events/store.py +187 -0
- sqlspec/adapters/spanner/litestar/__init__.py +5 -0
- sqlspec/adapters/spanner/litestar/store.py +291 -0
- sqlspec/adapters/spanner/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/spanner/type_converter.py +342 -0
- sqlspec/adapters/sqlite/__init__.py +19 -0
- sqlspec/adapters/sqlite/_typing.py +123 -0
- sqlspec/adapters/sqlite/adk/__init__.py +5 -0
- sqlspec/adapters/sqlite/adk/store.py +992 -0
- sqlspec/adapters/sqlite/config.py +240 -0
- sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/core.py +357 -0
- sqlspec/adapters/sqlite/data_dictionary.py +198 -0
- sqlspec/adapters/sqlite/driver.py +527 -0
- sqlspec/adapters/sqlite/events/__init__.py +5 -0
- sqlspec/adapters/sqlite/events/store.py +20 -0
- sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
- sqlspec/adapters/sqlite/litestar/store.py +316 -0
- sqlspec/adapters/sqlite/pool.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/pool.py +237 -0
- sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/adapters/sqlite/type_converter.py +114 -0
- sqlspec/base.py +832 -0
- sqlspec/builder/__init__.py +181 -0
- sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_base.py +1071 -0
- sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_column.py +521 -0
- sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_ddl.py +1691 -0
- sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_delete.py +95 -0
- sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_dml.py +386 -0
- sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_explain.py +579 -0
- sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_expression_wrappers.py +46 -0
- sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_factory.py +1884 -0
- sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_insert.py +405 -0
- sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_join.py +489 -0
- sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_merge.py +823 -0
- sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_parsing_utils.py +295 -0
- sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_select.py +1666 -0
- sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_temporal.py +167 -0
- sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_update.py +173 -0
- sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
- sqlspec/builder/_vector_distance.py +330 -0
- sqlspec/cli.py +1095 -0
- sqlspec/config.py +2383 -0
- sqlspec/core/__init__.py +372 -0
- sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_correlation.py +176 -0
- sqlspec/core/_pagination.py +42 -0
- sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
- sqlspec/core/_pool.py +76 -0
- sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
- sqlspec/core/cache.py +1085 -0
- sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
- sqlspec/core/compiler.py +1090 -0
- sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/core/config_runtime.py +174 -0
- sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
- sqlspec/core/explain.py +275 -0
- sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
- sqlspec/core/filters.py +969 -0
- sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
- sqlspec/core/hashing.py +266 -0
- sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
- sqlspec/core/metrics.py +83 -0
- sqlspec/core/parameters/__init__.py +72 -0
- sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_alignment.py +283 -0
- sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_converter.py +554 -0
- sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_processor.py +1182 -0
- sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_registry.py +206 -0
- sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_transformers.py +324 -0
- sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_types.py +536 -0
- sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
- sqlspec/core/parameters/_validator.py +171 -0
- sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/core/pipeline.py +333 -0
- sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
- sqlspec/core/query_modifiers.py +508 -0
- sqlspec/core/result/__init__.py +25 -0
- sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_base.py +1232 -0
- sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
- sqlspec/core/result/_io.py +28 -0
- sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/splitter.py +1021 -0
- sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/sqlcommenter.py +249 -0
- sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
- sqlspec/core/stack.py +163 -0
- sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
- sqlspec/core/statement.py +1865 -0
- sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
- sqlspec/core/type_converter.py +340 -0
- sqlspec/data_dictionary/__init__.py +22 -0
- sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_loader.py +138 -0
- sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_registry.py +74 -0
- sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/_types.py +121 -0
- sqlspec/data_dictionary/dialects/__init__.py +21 -0
- sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/bigquery.py +81 -0
- sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
- sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/duckdb.py +47 -0
- sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/mysql.py +53 -0
- sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/oracle.py +197 -0
- sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/postgres.py +69 -0
- sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/spanner.py +37 -0
- sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
- sqlspec/data_dictionary/dialects/sqlite.py +59 -0
- sqlspec/data_dictionary/sql/.gitkeep +0 -0
- sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
- sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
- sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
- sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
- sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
- sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
- sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
- sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
- sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
- sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
- sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
- sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
- sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
- sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
- sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
- sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
- sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
- sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
- sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
- sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
- sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
- sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
- sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
- sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
- sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
- sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
- sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
- sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
- sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
- sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
- sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
- sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
- sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
- sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
- sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
- sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
- sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
- sqlspec/dialects/__init__.py +22 -0
- sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/_compat.py +14 -0
- sqlspec/dialects/postgres/__init__.py +9 -0
- sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_generators.py +57 -0
- sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/postgres/_operators.py +81 -0
- sqlspec/dialects/postgres/_paradedb.py +50 -0
- sqlspec/dialects/postgres/_pgvector.py +36 -0
- sqlspec/dialects/spanner/__init__.py +6 -0
- sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
- sqlspec/dialects/spanner/_generators.py +206 -0
- sqlspec/dialects/spanner/_spangres.py +77 -0
- sqlspec/dialects/spanner/_spanner.py +179 -0
- sqlspec/driver/__init__.py +49 -0
- sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_async.py +1830 -0
- sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_common.py +2292 -0
- sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_exception_handler.py +108 -0
- sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_query_cache.py +96 -0
- sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sql_helpers.py +139 -0
- sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_storage_helpers.py +153 -0
- sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
- sqlspec/driver/_sync.py +1817 -0
- sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
- sqlspec/exceptions.py +480 -0
- sqlspec/extensions/__init__.py +0 -0
- sqlspec/extensions/adk/__init__.py +84 -0
- sqlspec/extensions/adk/_config_utils.py +199 -0
- sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/_types.py +41 -0
- sqlspec/extensions/adk/artifact/__init__.py +57 -0
- sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/artifact/_types.py +32 -0
- sqlspec/extensions/adk/artifact/service.py +508 -0
- sqlspec/extensions/adk/artifact/store.py +361 -0
- sqlspec/extensions/adk/converters.py +212 -0
- sqlspec/extensions/adk/memory/__init__.py +69 -0
- sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/adk/memory/_types.py +30 -0
- sqlspec/extensions/adk/memory/converters.py +225 -0
- sqlspec/extensions/adk/memory/service.py +316 -0
- sqlspec/extensions/adk/memory/store.py +525 -0
- sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
- sqlspec/extensions/adk/migrations/__init__.py +0 -0
- sqlspec/extensions/adk/service.py +279 -0
- sqlspec/extensions/adk/store.py +590 -0
- sqlspec/extensions/events/__init__.py +51 -0
- sqlspec/extensions/events/_channel.py +703 -0
- sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_hints.py +45 -0
- sqlspec/extensions/events/_models.py +23 -0
- sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/events/_payload.py +69 -0
- sqlspec/extensions/events/_protocols.py +134 -0
- sqlspec/extensions/events/_queue.py +462 -0
- sqlspec/extensions/events/_store.py +209 -0
- sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
- sqlspec/extensions/events/migrations/__init__.py +3 -0
- sqlspec/extensions/fastapi/__init__.py +22 -0
- sqlspec/extensions/fastapi/extension.py +391 -0
- sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/fastapi/providers.py +712 -0
- sqlspec/extensions/flask/__init__.py +38 -0
- sqlspec/extensions/flask/_state.py +87 -0
- sqlspec/extensions/flask/_utils.py +71 -0
- sqlspec/extensions/flask/extension.py +539 -0
- sqlspec/extensions/litestar/__init__.py +31 -0
- sqlspec/extensions/litestar/_utils.py +52 -0
- sqlspec/extensions/litestar/channels.py +165 -0
- sqlspec/extensions/litestar/cli.py +102 -0
- sqlspec/extensions/litestar/config.py +90 -0
- sqlspec/extensions/litestar/handlers.py +316 -0
- sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
- sqlspec/extensions/litestar/migrations/__init__.py +3 -0
- sqlspec/extensions/litestar/plugin.py +1066 -0
- sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
- sqlspec/extensions/litestar/providers.py +784 -0
- sqlspec/extensions/litestar/store.py +298 -0
- sqlspec/extensions/otel/__init__.py +58 -0
- sqlspec/extensions/prometheus/__init__.py +113 -0
- sqlspec/extensions/sanic/__init__.py +19 -0
- sqlspec/extensions/sanic/_state.py +43 -0
- sqlspec/extensions/sanic/_utils.py +127 -0
- sqlspec/extensions/sanic/extension.py +647 -0
- sqlspec/extensions/starlette/__init__.py +22 -0
- sqlspec/extensions/starlette/_state.py +42 -0
- sqlspec/extensions/starlette/_utils.py +96 -0
- sqlspec/extensions/starlette/extension.py +374 -0
- sqlspec/extensions/starlette/middleware.py +281 -0
- sqlspec/loader.cp314-win_amd64.pyd +0 -0
- sqlspec/loader.py +727 -0
- sqlspec/migrations/__init__.py +39 -0
- sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/base.py +862 -0
- sqlspec/migrations/commands.py +2151 -0
- sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/context.py +157 -0
- sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/fix.py +204 -0
- sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/loaders.py +443 -0
- sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/runner.py +1195 -0
- sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/squash.py +490 -0
- sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/templates.py +234 -0
- sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/tracker.py +792 -0
- sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/utils.py +256 -0
- sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/validation.py +359 -0
- sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
- sqlspec/migrations/version.py +446 -0
- sqlspec/observability/__init__.py +57 -0
- sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_common.py +77 -0
- sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_config.py +364 -0
- sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_diagnostics.py +74 -0
- sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_dispatcher.py +200 -0
- sqlspec/observability/_formatters/__init__.py +13 -0
- sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_aws.py +102 -0
- sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_azure.py +96 -0
- sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_base.py +57 -0
- sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_formatters/_gcp.py +131 -0
- sqlspec/observability/_formatting.py +58 -0
- sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_observer.py +361 -0
- sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_runtime.py +461 -0
- sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_sampling.py +188 -0
- sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
- sqlspec/observability/_spans.py +161 -0
- sqlspec/protocols.py +955 -0
- sqlspec/py.typed +0 -0
- sqlspec/service.py +433 -0
- sqlspec/storage/__init__.py +48 -0
- sqlspec/storage/_arrow_payload.py +68 -0
- sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/_paths.py +58 -0
- sqlspec/storage/_utils.py +46 -0
- sqlspec/storage/backends/__init__.py +1 -0
- sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/backends/base.py +374 -0
- sqlspec/storage/backends/fsspec.py +574 -0
- sqlspec/storage/backends/local.py +468 -0
- sqlspec/storage/backends/obstore.py +956 -0
- sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/errors.py +102 -0
- sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/pipeline.py +628 -0
- sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
- sqlspec/storage/registry.py +329 -0
- sqlspec/typing.py +405 -0
- sqlspec/utils/__init__.py +7 -0
- sqlspec/utils/arrow_helpers.py +384 -0
- sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/config_tools.py +314 -0
- sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/correlation.py +134 -0
- sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/deprecation.py +157 -0
- sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/dispatch.py +101 -0
- sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/fixtures.py +260 -0
- sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/logging.py +251 -0
- sqlspec/utils/module_loader.py +306 -0
- sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/portal.py +377 -0
- sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/schema.py +1040 -0
- sqlspec/utils/serializers/__init__.py +30 -0
- sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_json.py +415 -0
- sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_numpy.py +65 -0
- sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/serializers/_schema.py +285 -0
- sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/singleton.py +41 -0
- sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/sync_tools.py +316 -0
- sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/text.py +109 -0
- sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_converters.py +216 -0
- sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/type_guards.py +1508 -0
- sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
- sqlspec/utils/uuids.py +241 -0
- sqlspec-0.47.0.dist-info/METADATA +202 -0
- sqlspec-0.47.0.dist-info/RECORD +621 -0
- sqlspec-0.47.0.dist-info/WHEEL +4 -0
- sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
- sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
"""AsyncPG ADK store for Google Agent Development Kit session/event storage."""
|
|
2
|
+
|
|
3
|
+
from typing import TYPE_CHECKING, Any, Final
|
|
4
|
+
|
|
5
|
+
import asyncpg
|
|
6
|
+
|
|
7
|
+
from sqlspec.config import AsyncConfigT
|
|
8
|
+
from sqlspec.extensions.adk import BaseAsyncADKStore, EventRecord, SessionRecord
|
|
9
|
+
from sqlspec.extensions.adk.memory.store import BaseAsyncADKMemoryStore
|
|
10
|
+
|
|
11
|
+
if TYPE_CHECKING:
|
|
12
|
+
from datetime import datetime
|
|
13
|
+
|
|
14
|
+
from sqlspec.adapters.asyncpg.config import AsyncpgConfig
|
|
15
|
+
from sqlspec.extensions.adk import MemoryRecord
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
__all__ = ("AsyncpgADKMemoryStore", "AsyncpgADKStore")
|
|
19
|
+
|
|
20
|
+
POSTGRES_TABLE_NOT_FOUND_ERROR: Final = "42P01"
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
class AsyncpgADKStore(BaseAsyncADKStore[AsyncConfigT]):
|
|
24
|
+
"""PostgreSQL ADK store using asyncpg driver.
|
|
25
|
+
|
|
26
|
+
Implements session and event storage for Google Agent Development Kit
|
|
27
|
+
using PostgreSQL via asyncpg. Events are stored as a single JSONB blob
|
|
28
|
+
(``event_json``) alongside indexed scalar columns for efficient querying.
|
|
29
|
+
|
|
30
|
+
Provides:
|
|
31
|
+
- Session state management with JSONB storage
|
|
32
|
+
- Full-fidelity event storage via ``event_json`` JSONB column
|
|
33
|
+
- Atomic ``append_event_and_update_state`` for durable session mutations
|
|
34
|
+
- Microsecond-precision timestamps with TIMESTAMPTZ
|
|
35
|
+
- Foreign key constraints with cascade delete
|
|
36
|
+
- GIN indexes for JSONB queries
|
|
37
|
+
- HOT updates with FILLFACTOR 80
|
|
38
|
+
- Optional owner ID column for multi-tenancy
|
|
39
|
+
|
|
40
|
+
Args:
|
|
41
|
+
config: PostgreSQL database config with extension_config["adk"] settings.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
__slots__ = ()
|
|
45
|
+
|
|
46
|
+
def __init__(self, config: AsyncConfigT) -> None:
|
|
47
|
+
super().__init__(config)
|
|
48
|
+
|
|
49
|
+
async def _get_create_sessions_table_sql(self) -> str:
|
|
50
|
+
owner_id_line = ""
|
|
51
|
+
if self._owner_id_column_ddl:
|
|
52
|
+
owner_id_line = f",\n {self._owner_id_column_ddl}"
|
|
53
|
+
|
|
54
|
+
return f"""
|
|
55
|
+
CREATE TABLE IF NOT EXISTS {self._session_table} (
|
|
56
|
+
id VARCHAR(128) PRIMARY KEY,
|
|
57
|
+
app_name VARCHAR(128) NOT NULL,
|
|
58
|
+
user_id VARCHAR(128) NOT NULL{owner_id_line},
|
|
59
|
+
state JSONB NOT NULL DEFAULT '{{}}'::jsonb,
|
|
60
|
+
create_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
61
|
+
update_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
62
|
+
) WITH (fillfactor = 80);
|
|
63
|
+
|
|
64
|
+
CREATE INDEX IF NOT EXISTS idx_{self._session_table}_app_user
|
|
65
|
+
ON {self._session_table}(app_name, user_id);
|
|
66
|
+
|
|
67
|
+
CREATE INDEX IF NOT EXISTS idx_{self._session_table}_update_time
|
|
68
|
+
ON {self._session_table}(update_time DESC);
|
|
69
|
+
|
|
70
|
+
CREATE INDEX IF NOT EXISTS idx_{self._session_table}_state
|
|
71
|
+
ON {self._session_table} USING GIN (state)
|
|
72
|
+
WHERE state != '{{}}'::jsonb;
|
|
73
|
+
"""
|
|
74
|
+
|
|
75
|
+
async def _get_create_events_table_sql(self) -> str:
|
|
76
|
+
return f"""
|
|
77
|
+
CREATE TABLE IF NOT EXISTS {self._events_table} (
|
|
78
|
+
session_id VARCHAR(128) NOT NULL,
|
|
79
|
+
invocation_id VARCHAR(256) NOT NULL,
|
|
80
|
+
author VARCHAR(256) NOT NULL,
|
|
81
|
+
timestamp TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
82
|
+
event_json JSONB NOT NULL,
|
|
83
|
+
FOREIGN KEY (session_id) REFERENCES {self._session_table}(id) ON DELETE CASCADE
|
|
84
|
+
) WITH (fillfactor = 80);
|
|
85
|
+
|
|
86
|
+
CREATE INDEX IF NOT EXISTS idx_{self._events_table}_session
|
|
87
|
+
ON {self._events_table}(session_id, timestamp ASC);
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
def _get_drop_tables_sql(self) -> "list[str]":
|
|
91
|
+
return [f"DROP TABLE IF EXISTS {self._events_table}", f"DROP TABLE IF EXISTS {self._session_table}"]
|
|
92
|
+
|
|
93
|
+
async def create_tables(self) -> None:
|
|
94
|
+
async with self._config.provide_session() as driver:
|
|
95
|
+
await driver.execute_script(await self._get_create_sessions_table_sql())
|
|
96
|
+
await driver.execute_script(await self._get_create_events_table_sql())
|
|
97
|
+
|
|
98
|
+
async def create_session(
|
|
99
|
+
self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None
|
|
100
|
+
) -> SessionRecord:
|
|
101
|
+
async with self._config.provide_connection() as conn:
|
|
102
|
+
if self._owner_id_column_name:
|
|
103
|
+
sql = f"""
|
|
104
|
+
INSERT INTO {self._session_table}
|
|
105
|
+
(id, app_name, user_id, {self._owner_id_column_name}, state, create_time, update_time)
|
|
106
|
+
VALUES ($1, $2, $3, $4, $5, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
107
|
+
"""
|
|
108
|
+
await conn.execute(sql, session_id, app_name, user_id, owner_id, state)
|
|
109
|
+
else:
|
|
110
|
+
sql = f"""
|
|
111
|
+
INSERT INTO {self._session_table} (id, app_name, user_id, state, create_time, update_time)
|
|
112
|
+
VALUES ($1, $2, $3, $4, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
|
|
113
|
+
"""
|
|
114
|
+
await conn.execute(sql, session_id, app_name, user_id, state)
|
|
115
|
+
|
|
116
|
+
return await self.get_session(session_id) # type: ignore[return-value]
|
|
117
|
+
|
|
118
|
+
async def get_session(self, session_id: str) -> "SessionRecord | None":
|
|
119
|
+
sql = f"""
|
|
120
|
+
SELECT id, app_name, user_id, state, create_time, update_time
|
|
121
|
+
FROM {self._session_table}
|
|
122
|
+
WHERE id = $1
|
|
123
|
+
"""
|
|
124
|
+
|
|
125
|
+
try:
|
|
126
|
+
async with self._config.provide_connection() as conn:
|
|
127
|
+
row = await conn.fetchrow(sql, session_id)
|
|
128
|
+
|
|
129
|
+
if row is None:
|
|
130
|
+
return None
|
|
131
|
+
|
|
132
|
+
return SessionRecord(
|
|
133
|
+
id=row["id"],
|
|
134
|
+
app_name=row["app_name"],
|
|
135
|
+
user_id=row["user_id"],
|
|
136
|
+
state=row["state"],
|
|
137
|
+
create_time=row["create_time"],
|
|
138
|
+
update_time=row["update_time"],
|
|
139
|
+
)
|
|
140
|
+
except asyncpg.exceptions.UndefinedTableError:
|
|
141
|
+
return None
|
|
142
|
+
|
|
143
|
+
async def update_session_state(self, session_id: str, state: "dict[str, Any]") -> None:
|
|
144
|
+
sql = f"""
|
|
145
|
+
UPDATE {self._session_table}
|
|
146
|
+
SET state = $1, update_time = CURRENT_TIMESTAMP
|
|
147
|
+
WHERE id = $2
|
|
148
|
+
"""
|
|
149
|
+
|
|
150
|
+
async with self._config.provide_connection() as conn:
|
|
151
|
+
await conn.execute(sql, state, session_id)
|
|
152
|
+
|
|
153
|
+
async def delete_session(self, session_id: str) -> None:
|
|
154
|
+
sql = f"DELETE FROM {self._session_table} WHERE id = $1"
|
|
155
|
+
|
|
156
|
+
async with self._config.provide_connection() as conn:
|
|
157
|
+
await conn.execute(sql, session_id)
|
|
158
|
+
|
|
159
|
+
async def list_sessions(self, app_name: str, user_id: str | None = None) -> "list[SessionRecord]":
|
|
160
|
+
if user_id is None:
|
|
161
|
+
sql = f"""
|
|
162
|
+
SELECT id, app_name, user_id, state, create_time, update_time
|
|
163
|
+
FROM {self._session_table}
|
|
164
|
+
WHERE app_name = $1
|
|
165
|
+
ORDER BY update_time DESC
|
|
166
|
+
"""
|
|
167
|
+
params = [app_name]
|
|
168
|
+
else:
|
|
169
|
+
sql = f"""
|
|
170
|
+
SELECT id, app_name, user_id, state, create_time, update_time
|
|
171
|
+
FROM {self._session_table}
|
|
172
|
+
WHERE app_name = $1 AND user_id = $2
|
|
173
|
+
ORDER BY update_time DESC
|
|
174
|
+
"""
|
|
175
|
+
params = [app_name, user_id]
|
|
176
|
+
|
|
177
|
+
try:
|
|
178
|
+
async with self._config.provide_connection() as conn:
|
|
179
|
+
rows = await conn.fetch(sql, *params)
|
|
180
|
+
|
|
181
|
+
return [
|
|
182
|
+
SessionRecord(
|
|
183
|
+
id=row["id"],
|
|
184
|
+
app_name=row["app_name"],
|
|
185
|
+
user_id=row["user_id"],
|
|
186
|
+
state=row["state"],
|
|
187
|
+
create_time=row["create_time"],
|
|
188
|
+
update_time=row["update_time"],
|
|
189
|
+
)
|
|
190
|
+
for row in rows
|
|
191
|
+
]
|
|
192
|
+
except asyncpg.exceptions.UndefinedTableError:
|
|
193
|
+
return []
|
|
194
|
+
|
|
195
|
+
async def append_event(self, event_record: EventRecord) -> None:
|
|
196
|
+
sql = f"""
|
|
197
|
+
INSERT INTO {self._events_table} (
|
|
198
|
+
session_id, invocation_id, author, timestamp, event_json
|
|
199
|
+
) VALUES ($1, $2, $3, $4, $5)
|
|
200
|
+
"""
|
|
201
|
+
|
|
202
|
+
async with self._config.provide_connection() as conn:
|
|
203
|
+
await conn.execute(
|
|
204
|
+
sql,
|
|
205
|
+
event_record["session_id"],
|
|
206
|
+
event_record["invocation_id"],
|
|
207
|
+
event_record["author"],
|
|
208
|
+
event_record["timestamp"],
|
|
209
|
+
event_record["event_json"],
|
|
210
|
+
)
|
|
211
|
+
|
|
212
|
+
async def append_event_and_update_state(
|
|
213
|
+
self, event_record: EventRecord, session_id: str, state: "dict[str, Any]"
|
|
214
|
+
) -> SessionRecord:
|
|
215
|
+
insert_sql = f"""
|
|
216
|
+
INSERT INTO {self._events_table} (
|
|
217
|
+
session_id, invocation_id, author, timestamp, event_json
|
|
218
|
+
) VALUES ($1, $2, $3, $4, $5)
|
|
219
|
+
"""
|
|
220
|
+
update_sql = f"""
|
|
221
|
+
UPDATE {self._session_table}
|
|
222
|
+
SET state = $1, update_time = CURRENT_TIMESTAMP
|
|
223
|
+
WHERE id = $2
|
|
224
|
+
RETURNING id, app_name, user_id, state, create_time, update_time
|
|
225
|
+
"""
|
|
226
|
+
|
|
227
|
+
async with self._config.provide_connection() as conn, conn.transaction():
|
|
228
|
+
await conn.execute(
|
|
229
|
+
insert_sql,
|
|
230
|
+
event_record["session_id"],
|
|
231
|
+
event_record["invocation_id"],
|
|
232
|
+
event_record["author"],
|
|
233
|
+
event_record["timestamp"],
|
|
234
|
+
event_record["event_json"],
|
|
235
|
+
)
|
|
236
|
+
row = await conn.fetchrow(update_sql, state, session_id)
|
|
237
|
+
|
|
238
|
+
if row is None:
|
|
239
|
+
msg = f"Session {session_id} not found during append_event_and_update_state."
|
|
240
|
+
raise ValueError(msg)
|
|
241
|
+
|
|
242
|
+
return SessionRecord(
|
|
243
|
+
id=row["id"],
|
|
244
|
+
app_name=row["app_name"],
|
|
245
|
+
user_id=row["user_id"],
|
|
246
|
+
state=row["state"],
|
|
247
|
+
create_time=row["create_time"],
|
|
248
|
+
update_time=row["update_time"],
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
async def get_events(
|
|
252
|
+
self, session_id: str, after_timestamp: "datetime | None" = None, limit: "int | None" = None
|
|
253
|
+
) -> "list[EventRecord]":
|
|
254
|
+
where_clauses = ["session_id = $1"]
|
|
255
|
+
params: list[Any] = [session_id]
|
|
256
|
+
|
|
257
|
+
if after_timestamp is not None:
|
|
258
|
+
where_clauses.append(f"timestamp > ${len(params) + 1}")
|
|
259
|
+
params.append(after_timestamp)
|
|
260
|
+
|
|
261
|
+
where_clause = " AND ".join(where_clauses)
|
|
262
|
+
limit_clause = f" LIMIT ${len(params) + 1}" if limit else ""
|
|
263
|
+
if limit:
|
|
264
|
+
params.append(limit)
|
|
265
|
+
|
|
266
|
+
sql = f"""
|
|
267
|
+
SELECT session_id, invocation_id, author, timestamp, event_json
|
|
268
|
+
FROM {self._events_table}
|
|
269
|
+
WHERE {where_clause}
|
|
270
|
+
ORDER BY timestamp ASC{limit_clause}
|
|
271
|
+
"""
|
|
272
|
+
|
|
273
|
+
try:
|
|
274
|
+
async with self._config.provide_connection() as conn:
|
|
275
|
+
rows = await conn.fetch(sql, *params)
|
|
276
|
+
|
|
277
|
+
return [
|
|
278
|
+
EventRecord(
|
|
279
|
+
session_id=row["session_id"],
|
|
280
|
+
invocation_id=row["invocation_id"],
|
|
281
|
+
author=row["author"],
|
|
282
|
+
timestamp=row["timestamp"],
|
|
283
|
+
event_json=row["event_json"],
|
|
284
|
+
)
|
|
285
|
+
for row in rows
|
|
286
|
+
]
|
|
287
|
+
except asyncpg.exceptions.UndefinedTableError:
|
|
288
|
+
return []
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
class AsyncpgADKMemoryStore(BaseAsyncADKMemoryStore["AsyncpgConfig"]):
|
|
292
|
+
"""PostgreSQL ADK memory store using asyncpg driver.
|
|
293
|
+
|
|
294
|
+
Implements memory entry storage for Google Agent Development Kit
|
|
295
|
+
using PostgreSQL via the asyncpg driver. Provides:
|
|
296
|
+
- Session memory storage with JSONB for content and metadata
|
|
297
|
+
- Full-text search using to_tsvector/to_tsquery (postgres_fts strategy)
|
|
298
|
+
- Simple ILIKE search fallback (simple strategy)
|
|
299
|
+
- TIMESTAMPTZ for precise timestamp storage
|
|
300
|
+
- Deduplication via event_id unique constraint
|
|
301
|
+
- Efficient upserts using ON CONFLICT DO NOTHING
|
|
302
|
+
|
|
303
|
+
Args:
|
|
304
|
+
config: AsyncpgConfig with extension_config["adk"] settings.
|
|
305
|
+
"""
|
|
306
|
+
|
|
307
|
+
__slots__ = ()
|
|
308
|
+
|
|
309
|
+
def __init__(self, config: "AsyncpgConfig") -> None:
|
|
310
|
+
super().__init__(config)
|
|
311
|
+
|
|
312
|
+
async def _get_create_memory_table_sql(self) -> str:
|
|
313
|
+
owner_id_line = ""
|
|
314
|
+
if self._owner_id_column_ddl:
|
|
315
|
+
owner_id_line = f",\n {self._owner_id_column_ddl}"
|
|
316
|
+
|
|
317
|
+
fts_index = ""
|
|
318
|
+
if self._use_fts:
|
|
319
|
+
fts_index = f"""
|
|
320
|
+
CREATE INDEX IF NOT EXISTS idx_{self._memory_table}_fts
|
|
321
|
+
ON {self._memory_table} USING GIN (to_tsvector('english', content_text));
|
|
322
|
+
"""
|
|
323
|
+
|
|
324
|
+
return f"""
|
|
325
|
+
CREATE TABLE IF NOT EXISTS {self._memory_table} (
|
|
326
|
+
id VARCHAR(128) PRIMARY KEY,
|
|
327
|
+
session_id VARCHAR(128) NOT NULL,
|
|
328
|
+
app_name VARCHAR(128) NOT NULL,
|
|
329
|
+
user_id VARCHAR(128) NOT NULL,
|
|
330
|
+
event_id VARCHAR(128) NOT NULL UNIQUE,
|
|
331
|
+
author VARCHAR(256){owner_id_line},
|
|
332
|
+
timestamp TIMESTAMPTZ NOT NULL,
|
|
333
|
+
content_json JSONB NOT NULL,
|
|
334
|
+
content_text TEXT NOT NULL,
|
|
335
|
+
metadata_json JSONB,
|
|
336
|
+
inserted_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
|
|
337
|
+
);
|
|
338
|
+
|
|
339
|
+
CREATE INDEX IF NOT EXISTS idx_{self._memory_table}_app_user_time
|
|
340
|
+
ON {self._memory_table}(app_name, user_id, timestamp DESC);
|
|
341
|
+
|
|
342
|
+
CREATE INDEX IF NOT EXISTS idx_{self._memory_table}_session
|
|
343
|
+
ON {self._memory_table}(session_id);
|
|
344
|
+
{fts_index}
|
|
345
|
+
"""
|
|
346
|
+
|
|
347
|
+
def _get_drop_memory_table_sql(self) -> "list[str]":
|
|
348
|
+
return [f"DROP TABLE IF EXISTS {self._memory_table}"]
|
|
349
|
+
|
|
350
|
+
async def create_tables(self) -> None:
|
|
351
|
+
if not self._enabled:
|
|
352
|
+
return
|
|
353
|
+
|
|
354
|
+
async with self._config.provide_session() as driver:
|
|
355
|
+
await driver.execute_script(await self._get_create_memory_table_sql())
|
|
356
|
+
|
|
357
|
+
async def insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
|
|
358
|
+
if not self._enabled:
|
|
359
|
+
msg = "Memory store is disabled"
|
|
360
|
+
raise RuntimeError(msg)
|
|
361
|
+
|
|
362
|
+
if not entries:
|
|
363
|
+
return 0
|
|
364
|
+
|
|
365
|
+
inserted_count = 0
|
|
366
|
+
async with self._config.provide_connection() as conn:
|
|
367
|
+
for entry in entries:
|
|
368
|
+
if self._owner_id_column_name:
|
|
369
|
+
sql = f"""
|
|
370
|
+
INSERT INTO {self._memory_table}
|
|
371
|
+
(id, session_id, app_name, user_id, event_id, author,
|
|
372
|
+
{self._owner_id_column_name}, timestamp, content_json,
|
|
373
|
+
content_text, metadata_json, inserted_at)
|
|
374
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12)
|
|
375
|
+
ON CONFLICT (event_id) DO NOTHING
|
|
376
|
+
"""
|
|
377
|
+
result = await conn.execute(
|
|
378
|
+
sql,
|
|
379
|
+
entry["id"],
|
|
380
|
+
entry["session_id"],
|
|
381
|
+
entry["app_name"],
|
|
382
|
+
entry["user_id"],
|
|
383
|
+
entry["event_id"],
|
|
384
|
+
entry["author"],
|
|
385
|
+
owner_id,
|
|
386
|
+
entry["timestamp"],
|
|
387
|
+
entry["content_json"],
|
|
388
|
+
entry["content_text"],
|
|
389
|
+
entry["metadata_json"],
|
|
390
|
+
entry["inserted_at"],
|
|
391
|
+
)
|
|
392
|
+
else:
|
|
393
|
+
sql = f"""
|
|
394
|
+
INSERT INTO {self._memory_table}
|
|
395
|
+
(id, session_id, app_name, user_id, event_id, author,
|
|
396
|
+
timestamp, content_json, content_text, metadata_json, inserted_at)
|
|
397
|
+
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
|
|
398
|
+
ON CONFLICT (event_id) DO NOTHING
|
|
399
|
+
"""
|
|
400
|
+
result = await conn.execute(
|
|
401
|
+
sql,
|
|
402
|
+
entry["id"],
|
|
403
|
+
entry["session_id"],
|
|
404
|
+
entry["app_name"],
|
|
405
|
+
entry["user_id"],
|
|
406
|
+
entry["event_id"],
|
|
407
|
+
entry["author"],
|
|
408
|
+
entry["timestamp"],
|
|
409
|
+
entry["content_json"],
|
|
410
|
+
entry["content_text"],
|
|
411
|
+
entry["metadata_json"],
|
|
412
|
+
entry["inserted_at"],
|
|
413
|
+
)
|
|
414
|
+
try:
|
|
415
|
+
inserted_count += int(result.split(" ")[1])
|
|
416
|
+
except (IndexError, ValueError):
|
|
417
|
+
continue
|
|
418
|
+
|
|
419
|
+
return inserted_count
|
|
420
|
+
|
|
421
|
+
async def search_entries(
|
|
422
|
+
self, query: str, app_name: str, user_id: str, limit: "int | None" = None
|
|
423
|
+
) -> "list[MemoryRecord]":
|
|
424
|
+
if not self._enabled:
|
|
425
|
+
msg = "Memory store is disabled"
|
|
426
|
+
raise RuntimeError(msg)
|
|
427
|
+
|
|
428
|
+
if not query:
|
|
429
|
+
return []
|
|
430
|
+
|
|
431
|
+
from typing import cast
|
|
432
|
+
|
|
433
|
+
limit_value = limit or self._max_results
|
|
434
|
+
if self._use_fts:
|
|
435
|
+
sql = f"""
|
|
436
|
+
SELECT * FROM {self._memory_table}
|
|
437
|
+
WHERE app_name = $1 AND user_id = $2
|
|
438
|
+
AND to_tsvector('english', content_text) @@ plainto_tsquery('english', $3)
|
|
439
|
+
ORDER BY timestamp DESC
|
|
440
|
+
LIMIT $4
|
|
441
|
+
"""
|
|
442
|
+
params = (app_name, user_id, query, limit_value)
|
|
443
|
+
else:
|
|
444
|
+
sql = f"""
|
|
445
|
+
SELECT * FROM {self._memory_table}
|
|
446
|
+
WHERE app_name = $1 AND user_id = $2 AND content_text ILIKE $3
|
|
447
|
+
ORDER BY timestamp DESC
|
|
448
|
+
LIMIT $4
|
|
449
|
+
"""
|
|
450
|
+
params = (app_name, user_id, f"%{query}%", limit_value)
|
|
451
|
+
|
|
452
|
+
async with self._config.provide_connection() as conn:
|
|
453
|
+
rows = await conn.fetch(sql, *params)
|
|
454
|
+
return [cast("MemoryRecord", dict(row)) for row in rows]
|
|
455
|
+
|
|
456
|
+
async def delete_entries_by_session(self, session_id: str) -> int:
|
|
457
|
+
if not self._enabled:
|
|
458
|
+
msg = "Memory store is disabled"
|
|
459
|
+
raise RuntimeError(msg)
|
|
460
|
+
|
|
461
|
+
sql = f"DELETE FROM {self._memory_table} WHERE session_id = $1"
|
|
462
|
+
async with self._config.provide_connection() as conn:
|
|
463
|
+
result = await conn.execute(sql, session_id)
|
|
464
|
+
try:
|
|
465
|
+
return int(result.split(" ")[1])
|
|
466
|
+
except (IndexError, ValueError):
|
|
467
|
+
return 0
|
|
468
|
+
|
|
469
|
+
async def delete_entries_older_than(self, days: int) -> int:
|
|
470
|
+
if not self._enabled:
|
|
471
|
+
msg = "Memory store is disabled"
|
|
472
|
+
raise RuntimeError(msg)
|
|
473
|
+
|
|
474
|
+
sql = f"""
|
|
475
|
+
DELETE FROM {self._memory_table}
|
|
476
|
+
WHERE inserted_at < (CURRENT_TIMESTAMP - ($1::int * INTERVAL '1 day'))
|
|
477
|
+
"""
|
|
478
|
+
async with self._config.provide_connection() as conn:
|
|
479
|
+
result = await conn.execute(sql, days)
|
|
480
|
+
try:
|
|
481
|
+
return int(result.split(" ")[1])
|
|
482
|
+
except (IndexError, ValueError):
|
|
483
|
+
return 0
|