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,657 @@
1
+ """PyMySQL ADK store for Google Agent Development Kit session/event storage."""
2
+
3
+ import re
4
+ from typing import TYPE_CHECKING, Any, Final, cast
5
+
6
+ import pymysql
7
+
8
+ from sqlspec.extensions.adk import BaseAsyncADKStore, EventRecord, SessionRecord
9
+ from sqlspec.extensions.adk.memory.store import BaseAsyncADKMemoryStore
10
+ from sqlspec.utils.serializers import from_json, to_json
11
+ from sqlspec.utils.sync_tools import async_, run_
12
+
13
+ if TYPE_CHECKING:
14
+ from datetime import datetime
15
+
16
+ from sqlspec.adapters.pymysql.config import PyMysqlConfig
17
+ from sqlspec.extensions.adk import MemoryRecord
18
+
19
+
20
+ __all__ = ("PyMysqlADKMemoryStore", "PyMysqlADKStore")
21
+
22
+ MYSQL_TABLE_NOT_FOUND_ERROR: Final = 1146
23
+
24
+
25
+ def _parse_owner_id_column_for_mysql(column_ddl: str) -> "tuple[str, str]":
26
+ references_match = re.search(r"\s+REFERENCES\s+(.+)", column_ddl, re.IGNORECASE)
27
+ if not references_match:
28
+ return (column_ddl.strip(), "")
29
+
30
+ col_def = column_ddl[: references_match.start()].strip()
31
+ fk_clause = references_match.group(1).strip()
32
+ col_name = col_def.split()[0]
33
+ fk_constraint = f"FOREIGN KEY ({col_name}) REFERENCES {fk_clause}"
34
+ return (col_def, fk_constraint)
35
+
36
+
37
+ class PyMysqlADKStore(BaseAsyncADKStore["PyMysqlConfig"]):
38
+ """MySQL/MariaDB ADK store using PyMySQL.
39
+
40
+ Implements session and event storage for Google Agent Development Kit
41
+ using MySQL/MariaDB via the PyMySQL sync driver. Provides:
42
+ - Session state management with JSON storage
43
+ - Full-event JSON storage (single ``event_json`` column)
44
+ - Atomic event-create + state-update in one transaction
45
+ - Microsecond-precision timestamps
46
+ - Foreign key constraints with cascade delete
47
+
48
+ Notes:
49
+ - MySQL JSON type used - requires MySQL 5.7.8+
50
+ - TIMESTAMP(6) provides microsecond precision
51
+ - InnoDB engine required for foreign key support
52
+ - Configuration is read from config.extension_config["adk"]
53
+ """
54
+
55
+ __slots__ = ()
56
+
57
+ def __init__(self, config: "PyMysqlConfig") -> None:
58
+ super().__init__(config)
59
+
60
+ def _parse_owner_id_column_for_mysql(self, column_ddl: str) -> "tuple[str, str]":
61
+ return _parse_owner_id_column_for_mysql(column_ddl)
62
+
63
+ async def _get_create_sessions_table_sql(self) -> str:
64
+ owner_id_col = ""
65
+ fk_constraint = ""
66
+
67
+ if self._owner_id_column_ddl:
68
+ col_def, fk_def = self._parse_owner_id_column_for_mysql(self._owner_id_column_ddl)
69
+ owner_id_col = f"{col_def},"
70
+ if fk_def:
71
+ fk_constraint = f",\n {fk_def}"
72
+
73
+ return f"""
74
+ CREATE TABLE IF NOT EXISTS {self._session_table} (
75
+ id VARCHAR(128) PRIMARY KEY,
76
+ app_name VARCHAR(128) NOT NULL,
77
+ user_id VARCHAR(128) NOT NULL,
78
+ {owner_id_col}
79
+ state JSON NOT NULL,
80
+ create_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
81
+ update_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
82
+ INDEX idx_{self._session_table}_app_user (app_name, user_id),
83
+ INDEX idx_{self._session_table}_update_time (update_time DESC){fk_constraint}
84
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
85
+ """
86
+
87
+ async def _get_create_events_table_sql(self) -> str:
88
+ """Get MySQL CREATE TABLE SQL for events.
89
+
90
+ Post clean-break schema: 5 columns only.
91
+ """
92
+ return f"""
93
+ CREATE TABLE IF NOT EXISTS {self._events_table} (
94
+ session_id VARCHAR(128) NOT NULL,
95
+ invocation_id VARCHAR(256) NOT NULL,
96
+ author VARCHAR(128) NOT NULL,
97
+ timestamp TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
98
+ event_json JSON NOT NULL,
99
+ FOREIGN KEY (session_id) REFERENCES {self._session_table}(id) ON DELETE CASCADE,
100
+ INDEX idx_{self._events_table}_session (session_id, timestamp ASC)
101
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
102
+ """
103
+
104
+ def _get_drop_tables_sql(self) -> "list[str]":
105
+ return [f"DROP TABLE IF EXISTS {self._events_table}", f"DROP TABLE IF EXISTS {self._session_table}"]
106
+
107
+ def _create_tables(self) -> None:
108
+ with self._config.provide_session() as driver:
109
+ driver.execute_script(run_(self._get_create_sessions_table_sql)())
110
+ driver.execute_script(run_(self._get_create_events_table_sql)())
111
+
112
+ async def create_tables(self) -> None:
113
+ """Create tables if they don't exist."""
114
+ await async_(self._create_tables)()
115
+
116
+ def _create_session(
117
+ self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None
118
+ ) -> SessionRecord:
119
+ state_json = to_json(state)
120
+
121
+ params: tuple[Any, ...]
122
+ if self._owner_id_column_name:
123
+ sql = f"""
124
+ INSERT INTO {self._session_table} (id, app_name, user_id, {self._owner_id_column_name}, state, create_time, update_time)
125
+ VALUES (%s, %s, %s, %s, %s, UTC_TIMESTAMP(6), UTC_TIMESTAMP(6))
126
+ """
127
+ params = (session_id, app_name, user_id, owner_id, state_json)
128
+ else:
129
+ sql = f"""
130
+ INSERT INTO {self._session_table} (id, app_name, user_id, state, create_time, update_time)
131
+ VALUES (%s, %s, %s, %s, UTC_TIMESTAMP(6), UTC_TIMESTAMP(6))
132
+ """
133
+ params = (session_id, app_name, user_id, state_json)
134
+
135
+ with self._config.provide_connection() as conn:
136
+ cursor = conn.cursor()
137
+ try:
138
+ cursor.execute(sql, params)
139
+ finally:
140
+ cursor.close()
141
+ conn.commit()
142
+
143
+ result = self._get_session(session_id)
144
+ if result is None:
145
+ msg = "Failed to fetch created session"
146
+ raise RuntimeError(msg)
147
+ return result
148
+
149
+ async def create_session(
150
+ self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None
151
+ ) -> SessionRecord:
152
+ """Create a new session."""
153
+ return await async_(self._create_session)(session_id, app_name, user_id, state, owner_id)
154
+
155
+ def _get_session(self, session_id: str) -> "SessionRecord | None":
156
+ sql = f"""
157
+ SELECT id, app_name, user_id, state, create_time, update_time
158
+ FROM {self._session_table}
159
+ WHERE id = %s
160
+ """
161
+
162
+ try:
163
+ with self._config.provide_connection() as conn:
164
+ cursor = conn.cursor()
165
+ try:
166
+ cursor.execute(sql, (session_id,))
167
+ row = cursor.fetchone()
168
+ finally:
169
+ cursor.close()
170
+
171
+ if row is None:
172
+ return None
173
+
174
+ session_id_val, app_name, user_id, state_json, create_time, update_time = row
175
+
176
+ return SessionRecord(
177
+ id=session_id_val,
178
+ app_name=app_name,
179
+ user_id=user_id,
180
+ state=from_json(state_json) if isinstance(state_json, str) else state_json,
181
+ create_time=create_time,
182
+ update_time=update_time,
183
+ )
184
+ except pymysql.MySQLError as exc:
185
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
186
+ return None
187
+ raise
188
+
189
+ async def get_session(self, session_id: str) -> "SessionRecord | None":
190
+ """Get session by ID."""
191
+ return await async_(self._get_session)(session_id)
192
+
193
+ def _update_session_state(self, session_id: str, state: "dict[str, Any]") -> None:
194
+ state_json = to_json(state)
195
+
196
+ sql = f"""
197
+ UPDATE {self._session_table}
198
+ SET state = %s
199
+ WHERE id = %s
200
+ """
201
+
202
+ with self._config.provide_connection() as conn:
203
+ cursor = conn.cursor()
204
+ try:
205
+ cursor.execute(sql, (state_json, session_id))
206
+ finally:
207
+ cursor.close()
208
+ conn.commit()
209
+
210
+ async def update_session_state(self, session_id: str, state: "dict[str, Any]") -> None:
211
+ """Update session state."""
212
+ await async_(self._update_session_state)(session_id, state)
213
+
214
+ def _delete_session(self, session_id: str) -> None:
215
+ sql = f"DELETE FROM {self._session_table} WHERE id = %s"
216
+
217
+ with self._config.provide_connection() as conn:
218
+ cursor = conn.cursor()
219
+ try:
220
+ cursor.execute(sql, (session_id,))
221
+ finally:
222
+ cursor.close()
223
+ conn.commit()
224
+
225
+ async def delete_session(self, session_id: str) -> None:
226
+ """Delete session and associated events."""
227
+ await async_(self._delete_session)(session_id)
228
+
229
+ def _list_sessions(self, app_name: str, user_id: str | None = None) -> "list[SessionRecord]":
230
+ if user_id is None:
231
+ sql = f"""
232
+ SELECT id, app_name, user_id, state, create_time, update_time
233
+ FROM {self._session_table}
234
+ WHERE app_name = %s
235
+ ORDER BY update_time DESC
236
+ """
237
+ params: tuple[str, ...] = (app_name,)
238
+ else:
239
+ sql = f"""
240
+ SELECT id, app_name, user_id, state, create_time, update_time
241
+ FROM {self._session_table}
242
+ WHERE app_name = %s AND user_id = %s
243
+ ORDER BY update_time DESC
244
+ """
245
+ params = (app_name, user_id)
246
+
247
+ try:
248
+ with self._config.provide_connection() as conn:
249
+ cursor = conn.cursor()
250
+ try:
251
+ cursor.execute(sql, params)
252
+ rows = cursor.fetchall()
253
+ finally:
254
+ cursor.close()
255
+
256
+ return [
257
+ SessionRecord(
258
+ id=row[0],
259
+ app_name=row[1],
260
+ user_id=row[2],
261
+ state=from_json(row[3]) if isinstance(row[3], str) else row[3],
262
+ create_time=row[4],
263
+ update_time=row[5],
264
+ )
265
+ for row in rows
266
+ ]
267
+ except pymysql.MySQLError as exc:
268
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
269
+ return []
270
+ raise
271
+
272
+ async def list_sessions(self, app_name: str, user_id: str | None = None) -> "list[SessionRecord]":
273
+ """List sessions for an app."""
274
+ return await async_(self._list_sessions)(app_name, user_id)
275
+
276
+ def _append_event_and_update_state(
277
+ self, event_record: EventRecord, session_id: str, state: "dict[str, Any]"
278
+ ) -> SessionRecord:
279
+ """Atomically create an event and update the session's durable state.
280
+
281
+ MySQL doesn't support UPDATE...RETURNING; the UPDATE is followed by a
282
+ SELECT inside the same transaction so callers get the refreshed row
283
+ without acquiring a second connection.
284
+
285
+ Args:
286
+ event_record: Event record to store.
287
+ session_id: Session identifier whose state should be updated.
288
+ state: Post-append durable state snapshot.
289
+ """
290
+ event_json = event_record["event_json"]
291
+ event_json_str = to_json(event_json) if not isinstance(event_json, str) else event_json
292
+ state_json = to_json(state)
293
+
294
+ insert_sql = f"""
295
+ INSERT INTO {self._events_table} (
296
+ session_id, invocation_id, author, timestamp, event_json
297
+ ) VALUES (%s, %s, %s, %s, %s)
298
+ """
299
+
300
+ update_sql = f"""
301
+ UPDATE {self._session_table}
302
+ SET state = %s
303
+ WHERE id = %s
304
+ """
305
+
306
+ select_sql = f"""
307
+ SELECT id, app_name, user_id, state, create_time, update_time
308
+ FROM {self._session_table}
309
+ WHERE id = %s
310
+ """
311
+
312
+ with self._config.provide_connection() as conn:
313
+ cursor = conn.cursor()
314
+ try:
315
+ cursor.execute(
316
+ insert_sql,
317
+ (
318
+ event_record["session_id"],
319
+ event_record["invocation_id"],
320
+ event_record["author"],
321
+ event_record["timestamp"],
322
+ event_json_str,
323
+ ),
324
+ )
325
+ cursor.execute(update_sql, (state_json, session_id))
326
+ cursor.execute(select_sql, (session_id,))
327
+ row = cursor.fetchone()
328
+ finally:
329
+ cursor.close()
330
+ conn.commit()
331
+
332
+ if row is None:
333
+ msg = f"Session {session_id} not found during append_event_and_update_state."
334
+ raise ValueError(msg)
335
+
336
+ state_value = row[3]
337
+ return SessionRecord(
338
+ id=row[0],
339
+ app_name=row[1],
340
+ user_id=row[2],
341
+ state=from_json(state_value) if isinstance(state_value, str) else state_value,
342
+ create_time=row[4],
343
+ update_time=row[5],
344
+ )
345
+
346
+ async def append_event_and_update_state(
347
+ self, event_record: EventRecord, session_id: str, state: "dict[str, Any]"
348
+ ) -> SessionRecord:
349
+ """Atomically append an event and update the session's durable state."""
350
+ return await async_(self._append_event_and_update_state)(event_record, session_id, state)
351
+
352
+ def _insert_event(self, event_record: EventRecord) -> None:
353
+ event_json = event_record["event_json"]
354
+ event_json_str = to_json(event_json) if not isinstance(event_json, str) else event_json
355
+
356
+ sql = f"""
357
+ INSERT INTO {self._events_table} (
358
+ session_id, invocation_id, author, timestamp, event_json
359
+ ) VALUES (%s, %s, %s, %s, %s)
360
+ """
361
+
362
+ with self._config.provide_connection() as conn:
363
+ cursor = conn.cursor()
364
+ try:
365
+ cursor.execute(
366
+ sql,
367
+ (
368
+ event_record["session_id"],
369
+ event_record["invocation_id"],
370
+ event_record["author"],
371
+ event_record["timestamp"],
372
+ event_json_str,
373
+ ),
374
+ )
375
+ finally:
376
+ cursor.close()
377
+ conn.commit()
378
+
379
+ def _get_events(
380
+ self, session_id: str, after_timestamp: "datetime | None" = None, limit: "int | None" = None
381
+ ) -> "list[EventRecord]":
382
+ """List events for a session ordered by timestamp.
383
+
384
+ Args:
385
+ session_id: Session identifier.
386
+ after_timestamp: Only return events after this time.
387
+ limit: Maximum number of events to return.
388
+
389
+ Returns:
390
+ List of event records ordered by timestamp ASC.
391
+ """
392
+ where_clauses = ["session_id = %s"]
393
+ params: list[Any] = [session_id]
394
+
395
+ if after_timestamp is not None:
396
+ where_clauses.append("timestamp > %s")
397
+ params.append(after_timestamp)
398
+
399
+ where_clause = " AND ".join(where_clauses)
400
+ limit_clause = " LIMIT %s" if limit else ""
401
+ sql = f"""
402
+ SELECT session_id, invocation_id, author, timestamp, event_json
403
+ FROM {self._events_table}
404
+ WHERE {where_clause}
405
+ ORDER BY timestamp ASC{limit_clause}
406
+ """
407
+ if limit:
408
+ params.append(limit)
409
+
410
+ try:
411
+ with self._config.provide_connection() as conn:
412
+ cursor = conn.cursor()
413
+ try:
414
+ cursor.execute(sql, tuple(params))
415
+ rows = cursor.fetchall()
416
+ finally:
417
+ cursor.close()
418
+
419
+ return [
420
+ EventRecord(
421
+ session_id=row[0],
422
+ invocation_id=row[1],
423
+ author=row[2],
424
+ timestamp=row[3],
425
+ event_json=from_json(row[4]) if isinstance(row[4], str) else row[4],
426
+ )
427
+ for row in rows
428
+ ]
429
+ except pymysql.MySQLError as exc:
430
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
431
+ return []
432
+ raise
433
+
434
+ async def get_events(
435
+ self, session_id: str, after_timestamp: "datetime | None" = None, limit: "int | None" = None
436
+ ) -> "list[EventRecord]":
437
+ """Get events for a session."""
438
+ return await async_(self._get_events)(session_id, after_timestamp, limit)
439
+
440
+ def _append_event(self, event_record: EventRecord) -> None:
441
+ """Synchronous implementation of append_event."""
442
+ self._insert_event(event_record)
443
+
444
+ async def append_event(self, event_record: EventRecord) -> None:
445
+ """Append an event to a session."""
446
+ await async_(self._append_event)(event_record)
447
+
448
+
449
+ class PyMysqlADKMemoryStore(BaseAsyncADKMemoryStore["PyMysqlConfig"]):
450
+ """MySQL/MariaDB ADK memory store using PyMySQL."""
451
+
452
+ __slots__ = ()
453
+
454
+ def __init__(self, config: "PyMysqlConfig") -> None:
455
+ super().__init__(config)
456
+
457
+ async def _get_create_memory_table_sql(self) -> str:
458
+ owner_id_line = ""
459
+ fk_constraint = ""
460
+ if self._owner_id_column_ddl:
461
+ col_def, fk_def = _parse_owner_id_column_for_mysql(self._owner_id_column_ddl)
462
+ owner_id_line = f",\n {col_def}"
463
+ if fk_def:
464
+ fk_constraint = f",\n {fk_def}"
465
+
466
+ fts_index = ""
467
+ if self._use_fts:
468
+ fts_index = f",\n FULLTEXT INDEX idx_{self._memory_table}_fts (content_text)"
469
+
470
+ return f"""
471
+ CREATE TABLE IF NOT EXISTS {self._memory_table} (
472
+ id VARCHAR(128) PRIMARY KEY,
473
+ session_id VARCHAR(128) NOT NULL,
474
+ app_name VARCHAR(128) NOT NULL,
475
+ user_id VARCHAR(128) NOT NULL,
476
+ event_id VARCHAR(128) NOT NULL UNIQUE,
477
+ author VARCHAR(256){owner_id_line},
478
+ timestamp TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
479
+ content_json JSON NOT NULL,
480
+ content_text TEXT NOT NULL,
481
+ metadata_json JSON,
482
+ inserted_at TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
483
+ INDEX idx_{self._memory_table}_app_user_time (app_name, user_id, timestamp),
484
+ INDEX idx_{self._memory_table}_session (session_id){fts_index}{fk_constraint}
485
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
486
+ """
487
+
488
+ def _get_drop_memory_table_sql(self) -> "list[str]":
489
+ return [f"DROP TABLE IF EXISTS {self._memory_table}"]
490
+
491
+ def _create_tables(self) -> None:
492
+ if not self._enabled:
493
+ return
494
+
495
+ with self._config.provide_session() as driver:
496
+ driver.execute_script(run_(self._get_create_memory_table_sql)())
497
+
498
+ async def create_tables(self) -> None:
499
+ """Create tables if they don't exist."""
500
+ await async_(self._create_tables)()
501
+
502
+ def _insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
503
+ if not self._enabled:
504
+ msg = "Memory store is disabled"
505
+ raise RuntimeError(msg)
506
+
507
+ if not entries:
508
+ return 0
509
+
510
+ inserted_count = 0
511
+ if self._owner_id_column_name:
512
+ sql = f"""
513
+ INSERT IGNORE INTO {self._memory_table} (
514
+ id, session_id, app_name, user_id, event_id, author,
515
+ {self._owner_id_column_name}, timestamp, content_json,
516
+ content_text, metadata_json, inserted_at
517
+ ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
518
+ """
519
+ else:
520
+ sql = f"""
521
+ INSERT IGNORE INTO {self._memory_table} (
522
+ id, session_id, app_name, user_id, event_id, author,
523
+ timestamp, content_json, content_text, metadata_json, inserted_at
524
+ ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
525
+ """
526
+
527
+ with self._config.provide_connection() as conn:
528
+ cursor = conn.cursor()
529
+ try:
530
+ for entry in entries:
531
+ params: tuple[Any, ...]
532
+ if self._owner_id_column_name:
533
+ params = (
534
+ entry["id"],
535
+ entry["session_id"],
536
+ entry["app_name"],
537
+ entry["user_id"],
538
+ entry["event_id"],
539
+ entry["author"],
540
+ owner_id,
541
+ entry["timestamp"],
542
+ to_json(entry["content_json"]),
543
+ entry["content_text"],
544
+ to_json(entry["metadata_json"]),
545
+ entry["inserted_at"],
546
+ )
547
+ else:
548
+ params = (
549
+ entry["id"],
550
+ entry["session_id"],
551
+ entry["app_name"],
552
+ entry["user_id"],
553
+ entry["event_id"],
554
+ entry["author"],
555
+ entry["timestamp"],
556
+ to_json(entry["content_json"]),
557
+ entry["content_text"],
558
+ to_json(entry["metadata_json"]),
559
+ entry["inserted_at"],
560
+ )
561
+ cursor.execute(sql, params)
562
+ inserted_count += cursor.rowcount
563
+ finally:
564
+ cursor.close()
565
+ conn.commit()
566
+ return inserted_count
567
+
568
+ async def insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
569
+ """Bulk insert memory entries with deduplication."""
570
+ return await async_(self._insert_memory_entries)(entries, owner_id)
571
+
572
+ def _search_entries(
573
+ self, query: str, app_name: str, user_id: str, limit: "int | None" = None
574
+ ) -> "list[MemoryRecord]":
575
+ if not self._enabled:
576
+ msg = "Memory store is disabled"
577
+ raise RuntimeError(msg)
578
+
579
+ if not query:
580
+ return []
581
+
582
+ limit_value = limit or self._max_results
583
+ if self._use_fts:
584
+ sql = f"""
585
+ SELECT * FROM {self._memory_table}
586
+ WHERE app_name = %s AND user_id = %s
587
+ AND MATCH(content_text) AGAINST (%s IN NATURAL LANGUAGE MODE)
588
+ ORDER BY timestamp DESC
589
+ LIMIT %s
590
+ """
591
+ params = (app_name, user_id, query, limit_value)
592
+ else:
593
+ sql = f"""
594
+ SELECT * FROM {self._memory_table}
595
+ WHERE app_name = %s AND user_id = %s AND content_text LIKE %s
596
+ ORDER BY timestamp DESC
597
+ LIMIT %s
598
+ """
599
+ params = (app_name, user_id, f"%{query}%", limit_value)
600
+
601
+ with self._config.provide_connection() as conn:
602
+ cursor = conn.cursor()
603
+ try:
604
+ cursor.execute(sql, params)
605
+ rows = cursor.fetchall()
606
+ columns = [col[0] for col in cursor.description or []]
607
+ finally:
608
+ cursor.close()
609
+
610
+ return [cast("MemoryRecord", dict(zip(columns, row, strict=False))) for row in rows]
611
+
612
+ async def search_entries(
613
+ self, query: str, app_name: str, user_id: str, limit: "int | None" = None
614
+ ) -> "list[MemoryRecord]":
615
+ """Search memory entries by text query."""
616
+ return await async_(self._search_entries)(query, app_name, user_id, limit)
617
+
618
+ def _delete_entries_by_session(self, session_id: str) -> int:
619
+ if not self._enabled:
620
+ msg = "Memory store is disabled"
621
+ raise RuntimeError(msg)
622
+
623
+ sql = f"DELETE FROM {self._memory_table} WHERE session_id = %s"
624
+ with self._config.provide_connection() as conn:
625
+ cursor = conn.cursor()
626
+ try:
627
+ cursor.execute(sql, (session_id,))
628
+ conn.commit()
629
+ return cursor.rowcount if cursor.rowcount and cursor.rowcount > 0 else 0
630
+ finally:
631
+ cursor.close()
632
+
633
+ async def delete_entries_by_session(self, session_id: str) -> int:
634
+ """Delete all memory entries for a specific session."""
635
+ return await async_(self._delete_entries_by_session)(session_id)
636
+
637
+ def _delete_entries_older_than(self, days: int) -> int:
638
+ if not self._enabled:
639
+ msg = "Memory store is disabled"
640
+ raise RuntimeError(msg)
641
+
642
+ sql = f"""
643
+ DELETE FROM {self._memory_table}
644
+ WHERE inserted_at < (UTC_TIMESTAMP(6) - INTERVAL %s DAY)
645
+ """
646
+ with self._config.provide_connection() as conn:
647
+ cursor = conn.cursor()
648
+ try:
649
+ cursor.execute(sql, (days,))
650
+ conn.commit()
651
+ return cursor.rowcount if cursor.rowcount and cursor.rowcount > 0 else 0
652
+ finally:
653
+ cursor.close()
654
+
655
+ async def delete_entries_older_than(self, days: int) -> int:
656
+ """Delete memory entries older than specified days."""
657
+ return await async_(self._delete_entries_older_than)(days)