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.
Files changed (621) hide show
  1. f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
  2. sqlspec/__init__.py +167 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_typing.py +714 -0
  6. sqlspec/adapters/__init__.py +0 -0
  7. sqlspec/adapters/adbc/__init__.py +13 -0
  8. sqlspec/adapters/adbc/_typing.py +106 -0
  9. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  10. sqlspec/adapters/adbc/adk/store.py +1280 -0
  11. sqlspec/adapters/adbc/config.py +378 -0
  12. sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
  13. sqlspec/adapters/adbc/core.py +922 -0
  14. sqlspec/adapters/adbc/data_dictionary.py +339 -0
  15. sqlspec/adapters/adbc/driver.py +534 -0
  16. sqlspec/adapters/adbc/events/__init__.py +5 -0
  17. sqlspec/adapters/adbc/events/store.py +285 -0
  18. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  19. sqlspec/adapters/adbc/litestar/store.py +534 -0
  20. sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
  21. sqlspec/adapters/adbc/type_converter.py +142 -0
  22. sqlspec/adapters/aiomysql/__init__.py +21 -0
  23. sqlspec/adapters/aiomysql/_typing.py +137 -0
  24. sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
  25. sqlspec/adapters/aiomysql/adk/store.py +678 -0
  26. sqlspec/adapters/aiomysql/config.py +305 -0
  27. sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
  28. sqlspec/adapters/aiomysql/core.py +536 -0
  29. sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
  30. sqlspec/adapters/aiomysql/driver.py +386 -0
  31. sqlspec/adapters/aiomysql/events/__init__.py +5 -0
  32. sqlspec/adapters/aiomysql/events/store.py +104 -0
  33. sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
  34. sqlspec/adapters/aiomysql/litestar/store.py +314 -0
  35. sqlspec/adapters/aiosqlite/__init__.py +26 -0
  36. sqlspec/adapters/aiosqlite/_typing.py +109 -0
  37. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  38. sqlspec/adapters/aiosqlite/adk/store.py +829 -0
  39. sqlspec/adapters/aiosqlite/config.py +315 -0
  40. sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
  41. sqlspec/adapters/aiosqlite/core.py +315 -0
  42. sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
  43. sqlspec/adapters/aiosqlite/driver.py +311 -0
  44. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  45. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  46. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  47. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  48. sqlspec/adapters/aiosqlite/pool.cp314-win_amd64.pyd +0 -0
  49. sqlspec/adapters/aiosqlite/pool.py +734 -0
  50. sqlspec/adapters/asyncmy/__init__.py +21 -0
  51. sqlspec/adapters/asyncmy/_typing.py +113 -0
  52. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncmy/adk/store.py +644 -0
  54. sqlspec/adapters/asyncmy/config.py +307 -0
  55. sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
  56. sqlspec/adapters/asyncmy/core.py +538 -0
  57. sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
  58. sqlspec/adapters/asyncmy/driver.py +391 -0
  59. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  60. sqlspec/adapters/asyncmy/events/store.py +104 -0
  61. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  62. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  63. sqlspec/adapters/asyncpg/__init__.py +26 -0
  64. sqlspec/adapters/asyncpg/_typing.py +103 -0
  65. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  66. sqlspec/adapters/asyncpg/adk/store.py +483 -0
  67. sqlspec/adapters/asyncpg/config.py +575 -0
  68. sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
  69. sqlspec/adapters/asyncpg/core.py +480 -0
  70. sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
  71. sqlspec/adapters/asyncpg/driver.py +487 -0
  72. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  73. sqlspec/adapters/asyncpg/events/_hub.py +181 -0
  74. sqlspec/adapters/asyncpg/events/backend.py +210 -0
  75. sqlspec/adapters/asyncpg/events/store.py +40 -0
  76. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  77. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  78. sqlspec/adapters/bigquery/__init__.py +15 -0
  79. sqlspec/adapters/bigquery/_typing.py +108 -0
  80. sqlspec/adapters/bigquery/config.py +362 -0
  81. sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
  82. sqlspec/adapters/bigquery/core.py +768 -0
  83. sqlspec/adapters/bigquery/data_dictionary.py +120 -0
  84. sqlspec/adapters/bigquery/driver.py +542 -0
  85. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  86. sqlspec/adapters/bigquery/events/store.py +139 -0
  87. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  88. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  89. sqlspec/adapters/bigquery/type_converter.cp314-win_amd64.pyd +0 -0
  90. sqlspec/adapters/bigquery/type_converter.py +107 -0
  91. sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
  92. sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
  93. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  94. sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
  95. sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
  96. sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
  97. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  98. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
  99. sqlspec/adapters/cockroach_asyncpg/driver.py +142 -0
  100. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  101. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  102. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  103. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  104. sqlspec/adapters/cockroach_psycopg/__init__.py +39 -0
  105. sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
  106. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  107. sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
  108. sqlspec/adapters/cockroach_psycopg/config.py +511 -0
  109. sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
  110. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  111. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
  112. sqlspec/adapters/cockroach_psycopg/driver.py +273 -0
  113. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  114. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  115. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  116. sqlspec/adapters/cockroach_psycopg/litestar/store.py +327 -0
  117. sqlspec/adapters/duckdb/__init__.py +29 -0
  118. sqlspec/adapters/duckdb/_typing.py +104 -0
  119. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  120. sqlspec/adapters/duckdb/adk/store.py +935 -0
  121. sqlspec/adapters/duckdb/config.py +386 -0
  122. sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
  123. sqlspec/adapters/duckdb/core.py +332 -0
  124. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  125. sqlspec/adapters/duckdb/driver.py +426 -0
  126. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  127. sqlspec/adapters/duckdb/events/store.py +57 -0
  128. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  129. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  130. sqlspec/adapters/duckdb/pool.cp314-win_amd64.pyd +0 -0
  131. sqlspec/adapters/duckdb/pool.py +350 -0
  132. sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
  133. sqlspec/adapters/duckdb/type_converter.py +118 -0
  134. sqlspec/adapters/mysqlconnector/__init__.py +39 -0
  135. sqlspec/adapters/mysqlconnector/_typing.py +186 -0
  136. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  137. sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
  138. sqlspec/adapters/mysqlconnector/config.py +421 -0
  139. sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
  140. sqlspec/adapters/mysqlconnector/core.py +472 -0
  141. sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
  142. sqlspec/adapters/mysqlconnector/driver.py +516 -0
  143. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  144. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  145. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  146. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  147. sqlspec/adapters/oracledb/__init__.py +39 -0
  148. sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
  149. sqlspec/adapters/oracledb/_json_handlers.py +196 -0
  150. sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
  151. sqlspec/adapters/oracledb/_param_types.py +46 -0
  152. sqlspec/adapters/oracledb/_typing.py +258 -0
  153. sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
  154. sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
  155. sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
  156. sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
  157. sqlspec/adapters/oracledb/adk/__init__.py +21 -0
  158. sqlspec/adapters/oracledb/adk/store.py +2453 -0
  159. sqlspec/adapters/oracledb/config.py +575 -0
  160. sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
  161. sqlspec/adapters/oracledb/core.py +820 -0
  162. sqlspec/adapters/oracledb/data_dictionary.py +404 -0
  163. sqlspec/adapters/oracledb/driver.py +1277 -0
  164. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  165. sqlspec/adapters/oracledb/events/_hub.py +345 -0
  166. sqlspec/adapters/oracledb/events/backend.py +300 -0
  167. sqlspec/adapters/oracledb/events/store.py +420 -0
  168. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  169. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  170. sqlspec/adapters/oracledb/migrations.py +539 -0
  171. sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
  172. sqlspec/adapters/oracledb/type_converter.py +211 -0
  173. sqlspec/adapters/psqlpy/__init__.py +18 -0
  174. sqlspec/adapters/psqlpy/_typing.py +121 -0
  175. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  176. sqlspec/adapters/psqlpy/adk/store.py +591 -0
  177. sqlspec/adapters/psqlpy/config.py +376 -0
  178. sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
  179. sqlspec/adapters/psqlpy/core.py +694 -0
  180. sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
  181. sqlspec/adapters/psqlpy/driver.py +411 -0
  182. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  183. sqlspec/adapters/psqlpy/events/_hub.py +204 -0
  184. sqlspec/adapters/psqlpy/events/backend.py +210 -0
  185. sqlspec/adapters/psqlpy/events/store.py +20 -0
  186. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  187. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  188. sqlspec/adapters/psqlpy/type_converter.cp314-win_amd64.pyd +0 -0
  189. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  190. sqlspec/adapters/psycopg/__init__.py +38 -0
  191. sqlspec/adapters/psycopg/_typing.py +218 -0
  192. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  193. sqlspec/adapters/psycopg/adk/store.py +1106 -0
  194. sqlspec/adapters/psycopg/config.py +695 -0
  195. sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
  196. sqlspec/adapters/psycopg/core.py +520 -0
  197. sqlspec/adapters/psycopg/data_dictionary.py +278 -0
  198. sqlspec/adapters/psycopg/driver.py +1033 -0
  199. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  200. sqlspec/adapters/psycopg/events/_hub.py +388 -0
  201. sqlspec/adapters/psycopg/events/backend.py +398 -0
  202. sqlspec/adapters/psycopg/events/store.py +42 -0
  203. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  204. sqlspec/adapters/psycopg/litestar/store.py +554 -0
  205. sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
  206. sqlspec/adapters/psycopg/type_converter.py +93 -0
  207. sqlspec/adapters/pymysql/__init__.py +21 -0
  208. sqlspec/adapters/pymysql/_typing.py +92 -0
  209. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  210. sqlspec/adapters/pymysql/adk/store.py +657 -0
  211. sqlspec/adapters/pymysql/config.py +176 -0
  212. sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
  213. sqlspec/adapters/pymysql/core.py +469 -0
  214. sqlspec/adapters/pymysql/data_dictionary.py +120 -0
  215. sqlspec/adapters/pymysql/driver.py +271 -0
  216. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  217. sqlspec/adapters/pymysql/events/store.py +50 -0
  218. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  219. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  220. sqlspec/adapters/pymysql/pool.cp314-win_amd64.pyd +0 -0
  221. sqlspec/adapters/pymysql/pool.py +184 -0
  222. sqlspec/adapters/spanner/__init__.py +33 -0
  223. sqlspec/adapters/spanner/_typing.py +102 -0
  224. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  225. sqlspec/adapters/spanner/adk/store.py +758 -0
  226. sqlspec/adapters/spanner/config.py +355 -0
  227. sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
  228. sqlspec/adapters/spanner/core.py +263 -0
  229. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  230. sqlspec/adapters/spanner/driver.py +407 -0
  231. sqlspec/adapters/spanner/events/__init__.py +5 -0
  232. sqlspec/adapters/spanner/events/store.py +187 -0
  233. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  234. sqlspec/adapters/spanner/litestar/store.py +291 -0
  235. sqlspec/adapters/spanner/type_converter.cp314-win_amd64.pyd +0 -0
  236. sqlspec/adapters/spanner/type_converter.py +342 -0
  237. sqlspec/adapters/sqlite/__init__.py +19 -0
  238. sqlspec/adapters/sqlite/_typing.py +123 -0
  239. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  240. sqlspec/adapters/sqlite/adk/store.py +992 -0
  241. sqlspec/adapters/sqlite/config.py +240 -0
  242. sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
  243. sqlspec/adapters/sqlite/core.py +357 -0
  244. sqlspec/adapters/sqlite/data_dictionary.py +198 -0
  245. sqlspec/adapters/sqlite/driver.py +527 -0
  246. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  247. sqlspec/adapters/sqlite/events/store.py +20 -0
  248. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  249. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  250. sqlspec/adapters/sqlite/pool.cp314-win_amd64.pyd +0 -0
  251. sqlspec/adapters/sqlite/pool.py +237 -0
  252. sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
  253. sqlspec/adapters/sqlite/type_converter.py +114 -0
  254. sqlspec/base.py +832 -0
  255. sqlspec/builder/__init__.py +181 -0
  256. sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
  257. sqlspec/builder/_base.py +1071 -0
  258. sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
  259. sqlspec/builder/_column.py +521 -0
  260. sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
  261. sqlspec/builder/_ddl.py +1691 -0
  262. sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
  263. sqlspec/builder/_delete.py +95 -0
  264. sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
  265. sqlspec/builder/_dml.py +386 -0
  266. sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
  267. sqlspec/builder/_explain.py +579 -0
  268. sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
  269. sqlspec/builder/_expression_wrappers.py +46 -0
  270. sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
  271. sqlspec/builder/_factory.py +1884 -0
  272. sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
  273. sqlspec/builder/_insert.py +405 -0
  274. sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
  275. sqlspec/builder/_join.py +489 -0
  276. sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
  277. sqlspec/builder/_merge.py +823 -0
  278. sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
  279. sqlspec/builder/_parsing_utils.py +295 -0
  280. sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
  281. sqlspec/builder/_select.py +1666 -0
  282. sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
  283. sqlspec/builder/_temporal.py +167 -0
  284. sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
  285. sqlspec/builder/_update.py +173 -0
  286. sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
  287. sqlspec/builder/_vector_distance.py +330 -0
  288. sqlspec/cli.py +1095 -0
  289. sqlspec/config.py +2383 -0
  290. sqlspec/core/__init__.py +372 -0
  291. sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
  292. sqlspec/core/_correlation.py +176 -0
  293. sqlspec/core/_pagination.py +42 -0
  294. sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
  295. sqlspec/core/_pool.py +76 -0
  296. sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
  297. sqlspec/core/cache.py +1085 -0
  298. sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
  299. sqlspec/core/compiler.py +1090 -0
  300. sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
  301. sqlspec/core/config_runtime.py +174 -0
  302. sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
  303. sqlspec/core/explain.py +275 -0
  304. sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
  305. sqlspec/core/filters.py +969 -0
  306. sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
  307. sqlspec/core/hashing.py +266 -0
  308. sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
  309. sqlspec/core/metrics.py +83 -0
  310. sqlspec/core/parameters/__init__.py +72 -0
  311. sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
  312. sqlspec/core/parameters/_alignment.py +283 -0
  313. sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
  314. sqlspec/core/parameters/_converter.py +554 -0
  315. sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
  316. sqlspec/core/parameters/_processor.py +1182 -0
  317. sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
  318. sqlspec/core/parameters/_registry.py +206 -0
  319. sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
  320. sqlspec/core/parameters/_transformers.py +324 -0
  321. sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
  322. sqlspec/core/parameters/_types.py +536 -0
  323. sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
  324. sqlspec/core/parameters/_validator.py +171 -0
  325. sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
  326. sqlspec/core/pipeline.py +333 -0
  327. sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
  328. sqlspec/core/query_modifiers.py +508 -0
  329. sqlspec/core/result/__init__.py +25 -0
  330. sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
  331. sqlspec/core/result/_base.py +1232 -0
  332. sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
  333. sqlspec/core/result/_io.py +28 -0
  334. sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
  335. sqlspec/core/splitter.py +1021 -0
  336. sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
  337. sqlspec/core/sqlcommenter.py +249 -0
  338. sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
  339. sqlspec/core/stack.py +163 -0
  340. sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
  341. sqlspec/core/statement.py +1865 -0
  342. sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
  343. sqlspec/core/type_converter.py +340 -0
  344. sqlspec/data_dictionary/__init__.py +22 -0
  345. sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
  346. sqlspec/data_dictionary/_loader.py +138 -0
  347. sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
  348. sqlspec/data_dictionary/_registry.py +74 -0
  349. sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
  350. sqlspec/data_dictionary/_types.py +121 -0
  351. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  352. sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
  353. sqlspec/data_dictionary/dialects/bigquery.py +81 -0
  354. sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
  355. sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
  356. sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
  357. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  358. sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
  359. sqlspec/data_dictionary/dialects/mysql.py +53 -0
  360. sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
  361. sqlspec/data_dictionary/dialects/oracle.py +197 -0
  362. sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
  363. sqlspec/data_dictionary/dialects/postgres.py +69 -0
  364. sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
  365. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  366. sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
  367. sqlspec/data_dictionary/dialects/sqlite.py +59 -0
  368. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  369. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  370. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  371. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  372. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  373. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  374. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  375. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  376. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  377. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  378. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  379. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  380. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  381. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  382. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  383. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  384. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  385. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  386. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  387. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  388. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  389. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  390. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  391. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  392. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  393. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  394. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  395. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  396. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  397. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  398. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  399. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  400. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  401. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  402. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  403. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  404. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  405. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  406. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  407. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  408. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  409. sqlspec/dialects/__init__.py +22 -0
  410. sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
  411. sqlspec/dialects/_compat.py +14 -0
  412. sqlspec/dialects/postgres/__init__.py +9 -0
  413. sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
  414. sqlspec/dialects/postgres/_generators.py +57 -0
  415. sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
  416. sqlspec/dialects/postgres/_operators.py +81 -0
  417. sqlspec/dialects/postgres/_paradedb.py +50 -0
  418. sqlspec/dialects/postgres/_pgvector.py +36 -0
  419. sqlspec/dialects/spanner/__init__.py +6 -0
  420. sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
  421. sqlspec/dialects/spanner/_generators.py +206 -0
  422. sqlspec/dialects/spanner/_spangres.py +77 -0
  423. sqlspec/dialects/spanner/_spanner.py +179 -0
  424. sqlspec/driver/__init__.py +49 -0
  425. sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
  426. sqlspec/driver/_async.py +1830 -0
  427. sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
  428. sqlspec/driver/_common.py +2292 -0
  429. sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
  430. sqlspec/driver/_exception_handler.py +108 -0
  431. sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
  432. sqlspec/driver/_query_cache.py +96 -0
  433. sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
  434. sqlspec/driver/_sql_helpers.py +139 -0
  435. sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
  436. sqlspec/driver/_storage_helpers.py +153 -0
  437. sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
  438. sqlspec/driver/_sync.py +1817 -0
  439. sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
  440. sqlspec/exceptions.py +480 -0
  441. sqlspec/extensions/__init__.py +0 -0
  442. sqlspec/extensions/adk/__init__.py +84 -0
  443. sqlspec/extensions/adk/_config_utils.py +199 -0
  444. sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
  445. sqlspec/extensions/adk/_types.py +41 -0
  446. sqlspec/extensions/adk/artifact/__init__.py +57 -0
  447. sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
  448. sqlspec/extensions/adk/artifact/_types.py +32 -0
  449. sqlspec/extensions/adk/artifact/service.py +508 -0
  450. sqlspec/extensions/adk/artifact/store.py +361 -0
  451. sqlspec/extensions/adk/converters.py +212 -0
  452. sqlspec/extensions/adk/memory/__init__.py +69 -0
  453. sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
  454. sqlspec/extensions/adk/memory/_types.py +30 -0
  455. sqlspec/extensions/adk/memory/converters.py +225 -0
  456. sqlspec/extensions/adk/memory/service.py +316 -0
  457. sqlspec/extensions/adk/memory/store.py +525 -0
  458. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
  459. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  460. sqlspec/extensions/adk/service.py +279 -0
  461. sqlspec/extensions/adk/store.py +590 -0
  462. sqlspec/extensions/events/__init__.py +51 -0
  463. sqlspec/extensions/events/_channel.py +703 -0
  464. sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
  465. sqlspec/extensions/events/_hints.py +45 -0
  466. sqlspec/extensions/events/_models.py +23 -0
  467. sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
  468. sqlspec/extensions/events/_payload.py +69 -0
  469. sqlspec/extensions/events/_protocols.py +134 -0
  470. sqlspec/extensions/events/_queue.py +462 -0
  471. sqlspec/extensions/events/_store.py +209 -0
  472. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  473. sqlspec/extensions/events/migrations/__init__.py +3 -0
  474. sqlspec/extensions/fastapi/__init__.py +22 -0
  475. sqlspec/extensions/fastapi/extension.py +391 -0
  476. sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
  477. sqlspec/extensions/fastapi/providers.py +712 -0
  478. sqlspec/extensions/flask/__init__.py +38 -0
  479. sqlspec/extensions/flask/_state.py +87 -0
  480. sqlspec/extensions/flask/_utils.py +71 -0
  481. sqlspec/extensions/flask/extension.py +539 -0
  482. sqlspec/extensions/litestar/__init__.py +31 -0
  483. sqlspec/extensions/litestar/_utils.py +52 -0
  484. sqlspec/extensions/litestar/channels.py +165 -0
  485. sqlspec/extensions/litestar/cli.py +102 -0
  486. sqlspec/extensions/litestar/config.py +90 -0
  487. sqlspec/extensions/litestar/handlers.py +316 -0
  488. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  489. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  490. sqlspec/extensions/litestar/plugin.py +1066 -0
  491. sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
  492. sqlspec/extensions/litestar/providers.py +784 -0
  493. sqlspec/extensions/litestar/store.py +298 -0
  494. sqlspec/extensions/otel/__init__.py +58 -0
  495. sqlspec/extensions/prometheus/__init__.py +113 -0
  496. sqlspec/extensions/sanic/__init__.py +19 -0
  497. sqlspec/extensions/sanic/_state.py +43 -0
  498. sqlspec/extensions/sanic/_utils.py +127 -0
  499. sqlspec/extensions/sanic/extension.py +647 -0
  500. sqlspec/extensions/starlette/__init__.py +22 -0
  501. sqlspec/extensions/starlette/_state.py +42 -0
  502. sqlspec/extensions/starlette/_utils.py +96 -0
  503. sqlspec/extensions/starlette/extension.py +374 -0
  504. sqlspec/extensions/starlette/middleware.py +281 -0
  505. sqlspec/loader.cp314-win_amd64.pyd +0 -0
  506. sqlspec/loader.py +727 -0
  507. sqlspec/migrations/__init__.py +39 -0
  508. sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
  509. sqlspec/migrations/base.py +862 -0
  510. sqlspec/migrations/commands.py +2151 -0
  511. sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
  512. sqlspec/migrations/context.py +157 -0
  513. sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
  514. sqlspec/migrations/fix.py +204 -0
  515. sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
  516. sqlspec/migrations/loaders.py +443 -0
  517. sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
  518. sqlspec/migrations/runner.py +1195 -0
  519. sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
  520. sqlspec/migrations/squash.py +490 -0
  521. sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
  522. sqlspec/migrations/templates.py +234 -0
  523. sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
  524. sqlspec/migrations/tracker.py +792 -0
  525. sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
  526. sqlspec/migrations/utils.py +256 -0
  527. sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
  528. sqlspec/migrations/validation.py +359 -0
  529. sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
  530. sqlspec/migrations/version.py +446 -0
  531. sqlspec/observability/__init__.py +57 -0
  532. sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
  533. sqlspec/observability/_common.py +77 -0
  534. sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
  535. sqlspec/observability/_config.py +364 -0
  536. sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
  537. sqlspec/observability/_diagnostics.py +74 -0
  538. sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
  539. sqlspec/observability/_dispatcher.py +200 -0
  540. sqlspec/observability/_formatters/__init__.py +13 -0
  541. sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
  542. sqlspec/observability/_formatters/_aws.py +102 -0
  543. sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
  544. sqlspec/observability/_formatters/_azure.py +96 -0
  545. sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
  546. sqlspec/observability/_formatters/_base.py +57 -0
  547. sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
  548. sqlspec/observability/_formatters/_gcp.py +131 -0
  549. sqlspec/observability/_formatting.py +58 -0
  550. sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
  551. sqlspec/observability/_observer.py +361 -0
  552. sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
  553. sqlspec/observability/_runtime.py +461 -0
  554. sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
  555. sqlspec/observability/_sampling.py +188 -0
  556. sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
  557. sqlspec/observability/_spans.py +161 -0
  558. sqlspec/protocols.py +955 -0
  559. sqlspec/py.typed +0 -0
  560. sqlspec/service.py +433 -0
  561. sqlspec/storage/__init__.py +48 -0
  562. sqlspec/storage/_arrow_payload.py +68 -0
  563. sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
  564. sqlspec/storage/_paths.py +58 -0
  565. sqlspec/storage/_utils.py +46 -0
  566. sqlspec/storage/backends/__init__.py +1 -0
  567. sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
  568. sqlspec/storage/backends/base.py +374 -0
  569. sqlspec/storage/backends/fsspec.py +574 -0
  570. sqlspec/storage/backends/local.py +468 -0
  571. sqlspec/storage/backends/obstore.py +956 -0
  572. sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
  573. sqlspec/storage/errors.py +102 -0
  574. sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
  575. sqlspec/storage/pipeline.py +628 -0
  576. sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
  577. sqlspec/storage/registry.py +329 -0
  578. sqlspec/typing.py +405 -0
  579. sqlspec/utils/__init__.py +7 -0
  580. sqlspec/utils/arrow_helpers.py +384 -0
  581. sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
  582. sqlspec/utils/config_tools.py +314 -0
  583. sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
  584. sqlspec/utils/correlation.py +134 -0
  585. sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
  586. sqlspec/utils/deprecation.py +157 -0
  587. sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
  588. sqlspec/utils/dispatch.py +101 -0
  589. sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
  590. sqlspec/utils/fixtures.py +260 -0
  591. sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
  592. sqlspec/utils/logging.py +251 -0
  593. sqlspec/utils/module_loader.py +306 -0
  594. sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
  595. sqlspec/utils/portal.py +377 -0
  596. sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
  597. sqlspec/utils/schema.py +1040 -0
  598. sqlspec/utils/serializers/__init__.py +30 -0
  599. sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
  600. sqlspec/utils/serializers/_json.py +415 -0
  601. sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
  602. sqlspec/utils/serializers/_numpy.py +65 -0
  603. sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
  604. sqlspec/utils/serializers/_schema.py +285 -0
  605. sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
  606. sqlspec/utils/singleton.py +41 -0
  607. sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
  608. sqlspec/utils/sync_tools.py +316 -0
  609. sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
  610. sqlspec/utils/text.py +109 -0
  611. sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
  612. sqlspec/utils/type_converters.py +216 -0
  613. sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
  614. sqlspec/utils/type_guards.py +1508 -0
  615. sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
  616. sqlspec/utils/uuids.py +241 -0
  617. sqlspec-0.47.0.dist-info/METADATA +202 -0
  618. sqlspec-0.47.0.dist-info/RECORD +621 -0
  619. sqlspec-0.47.0.dist-info/WHEEL +4 -0
  620. sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
  621. sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,591 @@
1
+ """Psqlpy ADK store for Google Agent Development Kit session/event storage."""
2
+
3
+ import re
4
+ from typing import TYPE_CHECKING, Any, Final
5
+
6
+ import psqlpy.exceptions
7
+
8
+ from sqlspec.extensions.adk import BaseAsyncADKStore, EventRecord, SessionRecord
9
+ from sqlspec.extensions.adk.memory.store import BaseAsyncADKMemoryStore
10
+ from sqlspec.utils.logging import get_logger
11
+ from sqlspec.utils.type_guards import has_query_result_metadata
12
+
13
+ if TYPE_CHECKING:
14
+ from datetime import datetime
15
+
16
+ from sqlspec.adapters.psqlpy.config import PsqlpyConfig
17
+ from sqlspec.extensions.adk import MemoryRecord
18
+
19
+
20
+ __all__ = ("PsqlpyADKMemoryStore", "PsqlpyADKStore")
21
+
22
+ logger = get_logger("sqlspec.adapters.psqlpy.adk.store")
23
+
24
+ POSTGRES_TABLE_NOT_FOUND_SQLSTATE: Final = "42P01"
25
+
26
+
27
+ class PsqlpyADKStore(BaseAsyncADKStore["PsqlpyConfig"]):
28
+ """PostgreSQL ADK store using Psqlpy driver.
29
+
30
+ Implements session and event storage for Google Agent Development Kit
31
+ using PostgreSQL via the high-performance Rust-based psqlpy driver.
32
+ Events are stored as a single JSONB blob (``event_json``) alongside
33
+ indexed scalar columns for efficient querying.
34
+
35
+ Provides:
36
+ - Session state management with JSONB storage
37
+ - Full-fidelity event storage via ``event_json`` JSONB column
38
+ - Atomic ``append_event_and_update_state`` for durable session mutations
39
+ - Microsecond-precision timestamps with TIMESTAMPTZ
40
+ - Foreign key constraints with cascade delete
41
+ - GIN indexes for JSONB queries
42
+ - HOT updates with FILLFACTOR 80
43
+
44
+ Args:
45
+ config: PsqlpyConfig with extension_config["adk"] settings.
46
+ """
47
+
48
+ __slots__ = ()
49
+
50
+ def __init__(self, config: "PsqlpyConfig") -> None:
51
+ super().__init__(config)
52
+
53
+ async def _get_create_sessions_table_sql(self) -> str:
54
+ owner_id_line = ""
55
+ if self._owner_id_column_ddl:
56
+ owner_id_line = f",\n {self._owner_id_column_ddl}"
57
+
58
+ return f"""
59
+ CREATE TABLE IF NOT EXISTS {self._session_table} (
60
+ id VARCHAR(128) PRIMARY KEY,
61
+ app_name VARCHAR(128) NOT NULL,
62
+ user_id VARCHAR(128) NOT NULL{owner_id_line},
63
+ state JSONB NOT NULL DEFAULT '{{}}'::jsonb,
64
+ create_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
65
+ update_time TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
66
+ ) WITH (fillfactor = 80);
67
+
68
+ CREATE INDEX IF NOT EXISTS idx_{self._session_table}_app_user
69
+ ON {self._session_table}(app_name, user_id);
70
+
71
+ CREATE INDEX IF NOT EXISTS idx_{self._session_table}_update_time
72
+ ON {self._session_table}(update_time DESC);
73
+
74
+ CREATE INDEX IF NOT EXISTS idx_{self._session_table}_state
75
+ ON {self._session_table} USING GIN (state)
76
+ WHERE state != '{{}}'::jsonb;
77
+ """
78
+
79
+ async def _get_create_events_table_sql(self) -> str:
80
+ return f"""
81
+ CREATE TABLE IF NOT EXISTS {self._events_table} (
82
+ session_id VARCHAR(128) NOT NULL,
83
+ invocation_id VARCHAR(256) NOT NULL,
84
+ author VARCHAR(256) NOT NULL,
85
+ timestamp TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
86
+ event_json JSONB NOT NULL,
87
+ FOREIGN KEY (session_id) REFERENCES {self._session_table}(id) ON DELETE CASCADE
88
+ ) WITH (fillfactor = 80);
89
+
90
+ CREATE INDEX IF NOT EXISTS idx_{self._events_table}_session
91
+ ON {self._events_table}(session_id, timestamp ASC);
92
+ """
93
+
94
+ def _get_drop_tables_sql(self) -> "list[str]":
95
+ return [f"DROP TABLE IF EXISTS {self._events_table}", f"DROP TABLE IF EXISTS {self._session_table}"]
96
+
97
+ async def create_tables(self) -> None:
98
+ async with self._config.provide_session() as driver:
99
+ await driver.execute_script(await self._get_create_sessions_table_sql())
100
+ await driver.execute_script(await self._get_create_events_table_sql())
101
+
102
+ async def create_session(
103
+ self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None
104
+ ) -> SessionRecord:
105
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
106
+ if self._owner_id_column_name:
107
+ sql = f"""
108
+ INSERT INTO {self._session_table}
109
+ (id, app_name, user_id, {self._owner_id_column_name}, state, create_time, update_time)
110
+ VALUES ($1, $2, $3, $4, $5, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
111
+ """
112
+ await conn.execute(sql, [session_id, app_name, user_id, owner_id, state])
113
+ else:
114
+ sql = f"""
115
+ INSERT INTO {self._session_table} (id, app_name, user_id, state, create_time, update_time)
116
+ VALUES ($1, $2, $3, $4, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)
117
+ """
118
+ await conn.execute(sql, [session_id, app_name, user_id, state])
119
+
120
+ return await self.get_session(session_id) # type: ignore[return-value]
121
+
122
+ async def get_session(self, session_id: str) -> "SessionRecord | None":
123
+ sql = f"""
124
+ SELECT id, app_name, user_id, state, create_time, update_time
125
+ FROM {self._session_table}
126
+ WHERE id = $1
127
+ """
128
+
129
+ try:
130
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
131
+ result = await conn.fetch(sql, [session_id])
132
+ rows: list[dict[str, Any]] = result.result() if result else []
133
+
134
+ if not rows:
135
+ return None
136
+
137
+ row = rows[0]
138
+ return SessionRecord(
139
+ id=row["id"],
140
+ app_name=row["app_name"],
141
+ user_id=row["user_id"],
142
+ state=row["state"],
143
+ create_time=row["create_time"],
144
+ update_time=row["update_time"],
145
+ )
146
+ except psqlpy.exceptions.DatabaseError as e:
147
+ error_msg = str(e).lower()
148
+ if "does not exist" in error_msg or "relation" in error_msg:
149
+ return None
150
+ raise
151
+
152
+ async def update_session_state(self, session_id: str, state: "dict[str, Any]") -> None:
153
+ sql = f"""
154
+ UPDATE {self._session_table}
155
+ SET state = $1, update_time = CURRENT_TIMESTAMP
156
+ WHERE id = $2
157
+ """
158
+
159
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
160
+ await conn.execute(sql, [state, session_id])
161
+
162
+ async def delete_session(self, session_id: str) -> None:
163
+ sql = f"DELETE FROM {self._session_table} WHERE id = $1"
164
+
165
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
166
+ await conn.execute(sql, [session_id])
167
+
168
+ async def list_sessions(self, app_name: str, user_id: str | None = None) -> "list[SessionRecord]":
169
+ if user_id is None:
170
+ sql = f"""
171
+ SELECT id, app_name, user_id, state, create_time, update_time
172
+ FROM {self._session_table}
173
+ WHERE app_name = $1
174
+ ORDER BY update_time DESC
175
+ """
176
+ params = [app_name]
177
+ else:
178
+ sql = f"""
179
+ SELECT id, app_name, user_id, state, create_time, update_time
180
+ FROM {self._session_table}
181
+ WHERE app_name = $1 AND user_id = $2
182
+ ORDER BY update_time DESC
183
+ """
184
+ params = [app_name, user_id]
185
+
186
+ try:
187
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
188
+ result = await conn.fetch(sql, params)
189
+ rows: list[dict[str, Any]] = result.result() if result else []
190
+
191
+ return [
192
+ SessionRecord(
193
+ id=row["id"],
194
+ app_name=row["app_name"],
195
+ user_id=row["user_id"],
196
+ state=row["state"],
197
+ create_time=row["create_time"],
198
+ update_time=row["update_time"],
199
+ )
200
+ for row in rows
201
+ ]
202
+ except psqlpy.exceptions.DatabaseError as e:
203
+ error_msg = str(e).lower()
204
+ if "does not exist" in error_msg or "relation" in error_msg:
205
+ return []
206
+ raise
207
+
208
+ async def append_event(self, event_record: EventRecord) -> None:
209
+ sql = f"""
210
+ INSERT INTO {self._events_table} (
211
+ session_id, invocation_id, author, timestamp, event_json
212
+ ) VALUES ($1, $2, $3, $4, $5)
213
+ """
214
+
215
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
216
+ await conn.execute(
217
+ sql,
218
+ [
219
+ event_record["session_id"],
220
+ event_record["invocation_id"],
221
+ event_record["author"],
222
+ event_record["timestamp"],
223
+ event_record["event_json"],
224
+ ],
225
+ )
226
+
227
+ async def append_event_and_update_state(
228
+ self, event_record: EventRecord, session_id: str, state: "dict[str, Any]"
229
+ ) -> SessionRecord:
230
+ insert_sql = f"""
231
+ INSERT INTO {self._events_table} (
232
+ session_id, invocation_id, author, timestamp, event_json
233
+ ) VALUES ($1, $2, $3, $4, $5)
234
+ """
235
+ update_sql = f"""
236
+ UPDATE {self._session_table}
237
+ SET state = $1, update_time = CURRENT_TIMESTAMP
238
+ WHERE id = $2
239
+ RETURNING id, app_name, user_id, state, create_time, update_time
240
+ """
241
+
242
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
243
+ await conn.execute(
244
+ insert_sql,
245
+ [
246
+ event_record["session_id"],
247
+ event_record["invocation_id"],
248
+ event_record["author"],
249
+ event_record["timestamp"],
250
+ event_record["event_json"],
251
+ ],
252
+ )
253
+ result = await conn.fetch(update_sql, [state, session_id])
254
+ rows: list[dict[str, Any]] = result.result() if result else []
255
+
256
+ if not rows:
257
+ msg = f"Session {session_id} not found during append_event_and_update_state."
258
+ raise ValueError(msg)
259
+
260
+ row = rows[0]
261
+ return SessionRecord(
262
+ id=row["id"],
263
+ app_name=row["app_name"],
264
+ user_id=row["user_id"],
265
+ state=row["state"],
266
+ create_time=row["create_time"],
267
+ update_time=row["update_time"],
268
+ )
269
+
270
+ async def get_events(
271
+ self, session_id: str, after_timestamp: "datetime | None" = None, limit: "int | None" = None
272
+ ) -> "list[EventRecord]":
273
+ where_clauses = ["session_id = $1"]
274
+ params: list[Any] = [session_id]
275
+
276
+ if after_timestamp is not None:
277
+ where_clauses.append(f"timestamp > ${len(params) + 1}")
278
+ params.append(after_timestamp)
279
+
280
+ where_clause = " AND ".join(where_clauses)
281
+ limit_clause = f" LIMIT ${len(params) + 1}" if limit else ""
282
+ if limit:
283
+ params.append(limit)
284
+
285
+ sql = f"""
286
+ SELECT session_id, invocation_id, author, timestamp, event_json
287
+ FROM {self._events_table}
288
+ WHERE {where_clause}
289
+ ORDER BY timestamp ASC{limit_clause}
290
+ """
291
+
292
+ try:
293
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
294
+ result = await conn.fetch(sql, params)
295
+ rows: list[dict[str, Any]] = result.result() if result else []
296
+
297
+ return [
298
+ EventRecord(
299
+ session_id=row["session_id"],
300
+ invocation_id=row["invocation_id"],
301
+ author=row["author"],
302
+ timestamp=row["timestamp"],
303
+ event_json=row["event_json"],
304
+ )
305
+ for row in rows
306
+ ]
307
+ except psqlpy.exceptions.DatabaseError as e:
308
+ error_msg = str(e).lower()
309
+ if "does not exist" in error_msg or "relation" in error_msg:
310
+ return []
311
+ raise
312
+
313
+
314
+ PSQLPY_STATUS_REGEX: Final[re.Pattern[str]] = re.compile(r"^([A-Z]+)(?:\s+(\d+))?\s+(\d+)$", re.IGNORECASE)
315
+
316
+
317
+ class PsqlpyADKMemoryStore(BaseAsyncADKMemoryStore["PsqlpyConfig"]):
318
+ """PostgreSQL ADK memory store using Psqlpy driver."""
319
+
320
+ __slots__ = ()
321
+
322
+ def __init__(self, config: "PsqlpyConfig") -> None:
323
+ """Initialize Psqlpy memory store."""
324
+ super().__init__(config)
325
+
326
+ async def _get_create_memory_table_sql(self) -> str:
327
+ """Get PostgreSQL CREATE TABLE SQL for memory entries."""
328
+ owner_id_line = ""
329
+ if self._owner_id_column_ddl:
330
+ owner_id_line = f",\n {self._owner_id_column_ddl}"
331
+
332
+ fts_index = ""
333
+ if self._use_fts:
334
+ fts_index = f"""
335
+ CREATE INDEX IF NOT EXISTS idx_{self._memory_table}_fts
336
+ ON {self._memory_table} USING GIN (to_tsvector('english', content_text));
337
+ """
338
+
339
+ return f"""
340
+ CREATE TABLE IF NOT EXISTS {self._memory_table} (
341
+ id VARCHAR(128) PRIMARY KEY,
342
+ session_id VARCHAR(128) NOT NULL,
343
+ app_name VARCHAR(128) NOT NULL,
344
+ user_id VARCHAR(128) NOT NULL,
345
+ event_id VARCHAR(128) NOT NULL UNIQUE,
346
+ author VARCHAR(256){owner_id_line},
347
+ timestamp TIMESTAMPTZ NOT NULL,
348
+ content_json JSONB NOT NULL,
349
+ content_text TEXT NOT NULL,
350
+ metadata_json JSONB,
351
+ inserted_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
352
+ );
353
+
354
+ CREATE INDEX IF NOT EXISTS idx_{self._memory_table}_app_user_time
355
+ ON {self._memory_table}(app_name, user_id, timestamp DESC);
356
+
357
+ CREATE INDEX IF NOT EXISTS idx_{self._memory_table}_session
358
+ ON {self._memory_table}(session_id);
359
+ {fts_index}
360
+ """
361
+
362
+ def _get_drop_memory_table_sql(self) -> "list[str]":
363
+ """Get PostgreSQL DROP TABLE SQL statements."""
364
+ return [f"DROP TABLE IF EXISTS {self._memory_table}"]
365
+
366
+ async def create_tables(self) -> None:
367
+ """Create the memory table and indexes if they don't exist."""
368
+ if not self._enabled:
369
+ return
370
+
371
+ async with self._config.provide_session() as driver:
372
+ await driver.execute_script(await self._get_create_memory_table_sql())
373
+
374
+ async def insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
375
+ """Bulk insert memory entries with deduplication."""
376
+ if not self._enabled:
377
+ msg = "Memory store is disabled"
378
+ raise RuntimeError(msg)
379
+
380
+ if not entries:
381
+ return 0
382
+
383
+ inserted_count = 0
384
+ if self._owner_id_column_name:
385
+ sql = f"""
386
+ INSERT INTO {self._memory_table} (
387
+ id, session_id, app_name, user_id, event_id, author,
388
+ {self._owner_id_column_name}, timestamp, content_json,
389
+ content_text, metadata_json, inserted_at
390
+ ) VALUES (
391
+ $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12
392
+ )
393
+ ON CONFLICT (event_id) DO NOTHING
394
+ """
395
+ else:
396
+ sql = f"""
397
+ INSERT INTO {self._memory_table} (
398
+ id, session_id, app_name, user_id, event_id, author,
399
+ timestamp, content_json, content_text, metadata_json, inserted_at
400
+ ) VALUES (
401
+ $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11
402
+ )
403
+ ON CONFLICT (event_id) DO NOTHING
404
+ """
405
+
406
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
407
+ for entry in entries:
408
+ if self._owner_id_column_name:
409
+ params = [
410
+ entry["id"],
411
+ entry["session_id"],
412
+ entry["app_name"],
413
+ entry["user_id"],
414
+ entry["event_id"],
415
+ entry["author"],
416
+ owner_id,
417
+ entry["timestamp"],
418
+ entry["content_json"],
419
+ entry["content_text"],
420
+ entry["metadata_json"],
421
+ entry["inserted_at"],
422
+ ]
423
+ else:
424
+ params = [
425
+ entry["id"],
426
+ entry["session_id"],
427
+ entry["app_name"],
428
+ entry["user_id"],
429
+ entry["event_id"],
430
+ entry["author"],
431
+ entry["timestamp"],
432
+ entry["content_json"],
433
+ entry["content_text"],
434
+ entry["metadata_json"],
435
+ entry["inserted_at"],
436
+ ]
437
+
438
+ result = await conn.execute(sql, params)
439
+ rows_affected = self._extract_rows_affected(result)
440
+ if rows_affected > 0:
441
+ inserted_count += rows_affected
442
+
443
+ return inserted_count
444
+
445
+ async def search_entries(
446
+ self, query: str, app_name: str, user_id: str, limit: "int | None" = None
447
+ ) -> "list[MemoryRecord]":
448
+ """Search memory entries by text query."""
449
+ if not self._enabled:
450
+ msg = "Memory store is disabled"
451
+ raise RuntimeError(msg)
452
+
453
+ effective_limit = limit if limit is not None else self._max_results
454
+
455
+ try:
456
+ if self._use_fts:
457
+ try:
458
+ return await self._search_entries_fts(query, app_name, user_id, effective_limit)
459
+ except Exception as exc: # pragma: no cover - defensive fallback
460
+ logger.warning("FTS search failed; falling back to simple search: %s", exc)
461
+ return await self._search_entries_simple(query, app_name, user_id, effective_limit)
462
+ except psqlpy.exceptions.DatabaseError as e:
463
+ error_msg = str(e).lower()
464
+ if "does not exist" in error_msg or "relation" in error_msg:
465
+ return []
466
+ raise
467
+
468
+ async def _search_entries_fts(self, query: str, app_name: str, user_id: str, limit: int) -> "list[MemoryRecord]":
469
+ sql = f"""
470
+ SELECT id, session_id, app_name, user_id, event_id, author,
471
+ timestamp, content_json, content_text, metadata_json, inserted_at,
472
+ ts_rank(to_tsvector('english', content_text), plainto_tsquery('english', $1)) as rank
473
+ FROM {self._memory_table}
474
+ WHERE app_name = $2
475
+ AND user_id = $3
476
+ AND to_tsvector('english', content_text) @@ plainto_tsquery('english', $1)
477
+ ORDER BY rank DESC, timestamp DESC
478
+ LIMIT $4
479
+ """
480
+ params = [query, app_name, user_id, limit]
481
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
482
+ result = await conn.fetch(sql, params)
483
+ rows: list[dict[str, Any]] = result.result() if result else []
484
+ return _rows_to_records(rows)
485
+
486
+ async def _search_entries_simple(self, query: str, app_name: str, user_id: str, limit: int) -> "list[MemoryRecord]":
487
+ sql = f"""
488
+ SELECT id, session_id, app_name, user_id, event_id, author,
489
+ timestamp, content_json, content_text, metadata_json, inserted_at
490
+ FROM {self._memory_table}
491
+ WHERE app_name = $1
492
+ AND user_id = $2
493
+ AND content_text ILIKE $3
494
+ ORDER BY timestamp DESC
495
+ LIMIT $4
496
+ """
497
+ pattern = f"%{query}%"
498
+ params = [app_name, user_id, pattern, limit]
499
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
500
+ result = await conn.fetch(sql, params)
501
+ rows: list[dict[str, Any]] = result.result() if result else []
502
+ return _rows_to_records(rows)
503
+
504
+ async def delete_entries_by_session(self, session_id: str) -> int:
505
+ """Delete all memory entries for a specific session."""
506
+ count_sql = f"SELECT COUNT(*) AS count FROM {self._memory_table} WHERE session_id = $1"
507
+ delete_sql = f"DELETE FROM {self._memory_table} WHERE session_id = $1"
508
+
509
+ try:
510
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
511
+ count_result = await conn.fetch(count_sql, [session_id])
512
+ count_rows: list[dict[str, Any]] = count_result.result() if count_result else []
513
+ count = int(count_rows[0]["count"]) if count_rows else 0
514
+ await conn.execute(delete_sql, [session_id])
515
+ return count
516
+ except psqlpy.exceptions.DatabaseError as e:
517
+ error_msg = str(e).lower()
518
+ if "does not exist" in error_msg or "relation" in error_msg:
519
+ return 0
520
+ raise
521
+
522
+ async def delete_entries_older_than(self, days: int) -> int:
523
+ """Delete memory entries older than specified days."""
524
+ count_sql = f"""
525
+ SELECT COUNT(*) AS count FROM {self._memory_table}
526
+ WHERE inserted_at < CURRENT_TIMESTAMP - INTERVAL '{days} days'
527
+ """
528
+ delete_sql = f"""
529
+ DELETE FROM {self._memory_table}
530
+ WHERE inserted_at < CURRENT_TIMESTAMP - INTERVAL '{days} days'
531
+ """
532
+
533
+ try:
534
+ async with self._config.provide_connection() as conn: # pyright: ignore[reportAttributeAccessIssue]
535
+ count_result = await conn.fetch(count_sql, [])
536
+ count_rows: list[dict[str, Any]] = count_result.result() if count_result else []
537
+ count = int(count_rows[0]["count"]) if count_rows else 0
538
+ await conn.execute(delete_sql, [])
539
+ return count
540
+ except psqlpy.exceptions.DatabaseError as e:
541
+ error_msg = str(e).lower()
542
+ if "does not exist" in error_msg or "relation" in error_msg:
543
+ return 0
544
+ raise
545
+
546
+ def _extract_rows_affected(self, result: Any) -> int:
547
+ """Extract rows affected from psqlpy result."""
548
+ try:
549
+ if has_query_result_metadata(result):
550
+ if result.tag:
551
+ return self._parse_command_tag(result.tag)
552
+ if result.status:
553
+ return self._parse_command_tag(result.status)
554
+ if isinstance(result, str):
555
+ return self._parse_command_tag(result)
556
+ except Exception as e:
557
+ logger.debug("Failed to parse psqlpy command tag: %s", e)
558
+ return -1
559
+
560
+ def _parse_command_tag(self, tag: str) -> int:
561
+ """Parse PostgreSQL command tag to extract rows affected."""
562
+ if not tag:
563
+ return -1
564
+
565
+ match = PSQLPY_STATUS_REGEX.match(tag.strip())
566
+ if match:
567
+ command = match.group(1).upper()
568
+ if command == "INSERT" and match.group(3):
569
+ return int(match.group(3))
570
+ if command in {"UPDATE", "DELETE"} and match.group(3):
571
+ return int(match.group(3))
572
+ return -1
573
+
574
+
575
+ def _rows_to_records(rows: "list[dict[str, Any]]") -> "list[MemoryRecord]":
576
+ return [
577
+ {
578
+ "id": row["id"],
579
+ "session_id": row["session_id"],
580
+ "app_name": row["app_name"],
581
+ "user_id": row["user_id"],
582
+ "event_id": row["event_id"],
583
+ "author": row["author"],
584
+ "timestamp": row["timestamp"],
585
+ "content_json": row["content_json"],
586
+ "content_text": row["content_text"],
587
+ "metadata_json": row["metadata_json"],
588
+ "inserted_at": row["inserted_at"],
589
+ }
590
+ for row in rows
591
+ ]