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