sqlspec 0.36.0__cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (531) hide show
  1. ac8f31065839703b4e70__mypyc.cpython-310-aarch64-linux-gnu.so +0 -0
  2. sqlspec/__init__.py +140 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_serialization.py +315 -0
  6. sqlspec/_typing.py +700 -0
  7. sqlspec/adapters/__init__.py +0 -0
  8. sqlspec/adapters/adbc/__init__.py +5 -0
  9. sqlspec/adapters/adbc/_typing.py +82 -0
  10. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  11. sqlspec/adapters/adbc/adk/store.py +1273 -0
  12. sqlspec/adapters/adbc/config.py +295 -0
  13. sqlspec/adapters/adbc/core.cpython-310-aarch64-linux-gnu.so +0 -0
  14. sqlspec/adapters/adbc/core.py +735 -0
  15. sqlspec/adapters/adbc/data_dictionary.py +334 -0
  16. sqlspec/adapters/adbc/driver.py +529 -0
  17. sqlspec/adapters/adbc/events/__init__.py +5 -0
  18. sqlspec/adapters/adbc/events/store.py +285 -0
  19. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  20. sqlspec/adapters/adbc/litestar/store.py +502 -0
  21. sqlspec/adapters/adbc/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  22. sqlspec/adapters/adbc/type_converter.py +140 -0
  23. sqlspec/adapters/aiosqlite/__init__.py +25 -0
  24. sqlspec/adapters/aiosqlite/_typing.py +82 -0
  25. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  26. sqlspec/adapters/aiosqlite/adk/store.py +818 -0
  27. sqlspec/adapters/aiosqlite/config.py +334 -0
  28. sqlspec/adapters/aiosqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  29. sqlspec/adapters/aiosqlite/core.py +315 -0
  30. sqlspec/adapters/aiosqlite/data_dictionary.py +208 -0
  31. sqlspec/adapters/aiosqlite/driver.py +313 -0
  32. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  33. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  34. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  35. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  36. sqlspec/adapters/aiosqlite/pool.py +533 -0
  37. sqlspec/adapters/asyncmy/__init__.py +21 -0
  38. sqlspec/adapters/asyncmy/_typing.py +87 -0
  39. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  40. sqlspec/adapters/asyncmy/adk/store.py +703 -0
  41. sqlspec/adapters/asyncmy/config.py +302 -0
  42. sqlspec/adapters/asyncmy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  43. sqlspec/adapters/asyncmy/core.py +360 -0
  44. sqlspec/adapters/asyncmy/data_dictionary.py +124 -0
  45. sqlspec/adapters/asyncmy/driver.py +383 -0
  46. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  47. sqlspec/adapters/asyncmy/events/store.py +104 -0
  48. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  49. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  50. sqlspec/adapters/asyncpg/__init__.py +19 -0
  51. sqlspec/adapters/asyncpg/_typing.py +88 -0
  52. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncpg/adk/store.py +748 -0
  54. sqlspec/adapters/asyncpg/config.py +569 -0
  55. sqlspec/adapters/asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  56. sqlspec/adapters/asyncpg/core.py +367 -0
  57. sqlspec/adapters/asyncpg/data_dictionary.py +162 -0
  58. sqlspec/adapters/asyncpg/driver.py +487 -0
  59. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  60. sqlspec/adapters/asyncpg/events/backend.py +286 -0
  61. sqlspec/adapters/asyncpg/events/store.py +40 -0
  62. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  63. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  64. sqlspec/adapters/bigquery/__init__.py +14 -0
  65. sqlspec/adapters/bigquery/_typing.py +86 -0
  66. sqlspec/adapters/bigquery/adk/__init__.py +5 -0
  67. sqlspec/adapters/bigquery/adk/store.py +827 -0
  68. sqlspec/adapters/bigquery/config.py +353 -0
  69. sqlspec/adapters/bigquery/core.cpython-310-aarch64-linux-gnu.so +0 -0
  70. sqlspec/adapters/bigquery/core.py +715 -0
  71. sqlspec/adapters/bigquery/data_dictionary.py +128 -0
  72. sqlspec/adapters/bigquery/driver.py +548 -0
  73. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  74. sqlspec/adapters/bigquery/events/store.py +139 -0
  75. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  76. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  77. sqlspec/adapters/bigquery/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  78. sqlspec/adapters/bigquery/type_converter.py +107 -0
  79. sqlspec/adapters/cockroach_asyncpg/__init__.py +24 -0
  80. sqlspec/adapters/cockroach_asyncpg/_typing.py +72 -0
  81. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  82. sqlspec/adapters/cockroach_asyncpg/adk/store.py +410 -0
  83. sqlspec/adapters/cockroach_asyncpg/config.py +238 -0
  84. sqlspec/adapters/cockroach_asyncpg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  85. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  86. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +107 -0
  87. sqlspec/adapters/cockroach_asyncpg/driver.py +144 -0
  88. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  89. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  90. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  91. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  92. sqlspec/adapters/cockroach_psycopg/__init__.py +38 -0
  93. sqlspec/adapters/cockroach_psycopg/_typing.py +129 -0
  94. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  95. sqlspec/adapters/cockroach_psycopg/adk/store.py +868 -0
  96. sqlspec/adapters/cockroach_psycopg/config.py +484 -0
  97. sqlspec/adapters/cockroach_psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  98. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  99. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +215 -0
  100. sqlspec/adapters/cockroach_psycopg/driver.py +284 -0
  101. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  102. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  103. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  104. sqlspec/adapters/cockroach_psycopg/litestar/store.py +325 -0
  105. sqlspec/adapters/duckdb/__init__.py +25 -0
  106. sqlspec/adapters/duckdb/_typing.py +81 -0
  107. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  108. sqlspec/adapters/duckdb/adk/store.py +850 -0
  109. sqlspec/adapters/duckdb/config.py +463 -0
  110. sqlspec/adapters/duckdb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  111. sqlspec/adapters/duckdb/core.py +257 -0
  112. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  113. sqlspec/adapters/duckdb/driver.py +430 -0
  114. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  115. sqlspec/adapters/duckdb/events/store.py +57 -0
  116. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  117. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  118. sqlspec/adapters/duckdb/pool.py +293 -0
  119. sqlspec/adapters/duckdb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  120. sqlspec/adapters/duckdb/type_converter.py +118 -0
  121. sqlspec/adapters/mock/__init__.py +72 -0
  122. sqlspec/adapters/mock/_typing.py +147 -0
  123. sqlspec/adapters/mock/config.py +483 -0
  124. sqlspec/adapters/mock/core.py +319 -0
  125. sqlspec/adapters/mock/data_dictionary.py +366 -0
  126. sqlspec/adapters/mock/driver.py +721 -0
  127. sqlspec/adapters/mysqlconnector/__init__.py +36 -0
  128. sqlspec/adapters/mysqlconnector/_typing.py +141 -0
  129. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  130. sqlspec/adapters/mysqlconnector/adk/store.py +1060 -0
  131. sqlspec/adapters/mysqlconnector/config.py +394 -0
  132. sqlspec/adapters/mysqlconnector/core.cpython-310-aarch64-linux-gnu.so +0 -0
  133. sqlspec/adapters/mysqlconnector/core.py +303 -0
  134. sqlspec/adapters/mysqlconnector/data_dictionary.py +235 -0
  135. sqlspec/adapters/mysqlconnector/driver.py +483 -0
  136. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  137. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  138. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  139. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  140. sqlspec/adapters/oracledb/__init__.py +60 -0
  141. sqlspec/adapters/oracledb/_numpy_handlers.py +141 -0
  142. sqlspec/adapters/oracledb/_typing.py +182 -0
  143. sqlspec/adapters/oracledb/_uuid_handlers.py +166 -0
  144. sqlspec/adapters/oracledb/adk/__init__.py +10 -0
  145. sqlspec/adapters/oracledb/adk/store.py +2369 -0
  146. sqlspec/adapters/oracledb/config.py +550 -0
  147. sqlspec/adapters/oracledb/core.cpython-310-aarch64-linux-gnu.so +0 -0
  148. sqlspec/adapters/oracledb/core.py +543 -0
  149. sqlspec/adapters/oracledb/data_dictionary.py +536 -0
  150. sqlspec/adapters/oracledb/driver.py +1229 -0
  151. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  152. sqlspec/adapters/oracledb/events/backend.py +347 -0
  153. sqlspec/adapters/oracledb/events/store.py +420 -0
  154. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  155. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  156. sqlspec/adapters/oracledb/migrations.py +535 -0
  157. sqlspec/adapters/oracledb/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  158. sqlspec/adapters/oracledb/type_converter.py +211 -0
  159. sqlspec/adapters/psqlpy/__init__.py +17 -0
  160. sqlspec/adapters/psqlpy/_typing.py +79 -0
  161. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  162. sqlspec/adapters/psqlpy/adk/store.py +766 -0
  163. sqlspec/adapters/psqlpy/config.py +304 -0
  164. sqlspec/adapters/psqlpy/core.cpython-310-aarch64-linux-gnu.so +0 -0
  165. sqlspec/adapters/psqlpy/core.py +480 -0
  166. sqlspec/adapters/psqlpy/data_dictionary.py +126 -0
  167. sqlspec/adapters/psqlpy/driver.py +438 -0
  168. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  169. sqlspec/adapters/psqlpy/events/backend.py +310 -0
  170. sqlspec/adapters/psqlpy/events/store.py +20 -0
  171. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  172. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  173. sqlspec/adapters/psqlpy/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  174. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  175. sqlspec/adapters/psycopg/__init__.py +32 -0
  176. sqlspec/adapters/psycopg/_typing.py +164 -0
  177. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  178. sqlspec/adapters/psycopg/adk/store.py +1387 -0
  179. sqlspec/adapters/psycopg/config.py +576 -0
  180. sqlspec/adapters/psycopg/core.cpython-310-aarch64-linux-gnu.so +0 -0
  181. sqlspec/adapters/psycopg/core.py +450 -0
  182. sqlspec/adapters/psycopg/data_dictionary.py +289 -0
  183. sqlspec/adapters/psycopg/driver.py +975 -0
  184. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  185. sqlspec/adapters/psycopg/events/backend.py +458 -0
  186. sqlspec/adapters/psycopg/events/store.py +42 -0
  187. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  188. sqlspec/adapters/psycopg/litestar/store.py +552 -0
  189. sqlspec/adapters/psycopg/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  190. sqlspec/adapters/psycopg/type_converter.py +93 -0
  191. sqlspec/adapters/pymysql/__init__.py +21 -0
  192. sqlspec/adapters/pymysql/_typing.py +71 -0
  193. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  194. sqlspec/adapters/pymysql/adk/store.py +540 -0
  195. sqlspec/adapters/pymysql/config.py +195 -0
  196. sqlspec/adapters/pymysql/core.cpython-310-aarch64-linux-gnu.so +0 -0
  197. sqlspec/adapters/pymysql/core.py +299 -0
  198. sqlspec/adapters/pymysql/data_dictionary.py +122 -0
  199. sqlspec/adapters/pymysql/driver.py +259 -0
  200. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  201. sqlspec/adapters/pymysql/events/store.py +50 -0
  202. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  203. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  204. sqlspec/adapters/pymysql/pool.py +137 -0
  205. sqlspec/adapters/spanner/__init__.py +40 -0
  206. sqlspec/adapters/spanner/_typing.py +86 -0
  207. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  208. sqlspec/adapters/spanner/adk/store.py +732 -0
  209. sqlspec/adapters/spanner/config.py +352 -0
  210. sqlspec/adapters/spanner/core.cpython-310-aarch64-linux-gnu.so +0 -0
  211. sqlspec/adapters/spanner/core.py +188 -0
  212. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  213. sqlspec/adapters/spanner/dialect/__init__.py +6 -0
  214. sqlspec/adapters/spanner/dialect/_spangres.py +57 -0
  215. sqlspec/adapters/spanner/dialect/_spanner.py +130 -0
  216. sqlspec/adapters/spanner/driver.py +373 -0
  217. sqlspec/adapters/spanner/events/__init__.py +5 -0
  218. sqlspec/adapters/spanner/events/store.py +187 -0
  219. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  220. sqlspec/adapters/spanner/litestar/store.py +291 -0
  221. sqlspec/adapters/spanner/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  222. sqlspec/adapters/spanner/type_converter.py +331 -0
  223. sqlspec/adapters/sqlite/__init__.py +19 -0
  224. sqlspec/adapters/sqlite/_typing.py +80 -0
  225. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  226. sqlspec/adapters/sqlite/adk/store.py +958 -0
  227. sqlspec/adapters/sqlite/config.py +280 -0
  228. sqlspec/adapters/sqlite/core.cpython-310-aarch64-linux-gnu.so +0 -0
  229. sqlspec/adapters/sqlite/core.py +312 -0
  230. sqlspec/adapters/sqlite/data_dictionary.py +202 -0
  231. sqlspec/adapters/sqlite/driver.py +359 -0
  232. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  233. sqlspec/adapters/sqlite/events/store.py +20 -0
  234. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  235. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  236. sqlspec/adapters/sqlite/pool.py +198 -0
  237. sqlspec/adapters/sqlite/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  238. sqlspec/adapters/sqlite/type_converter.py +114 -0
  239. sqlspec/base.py +747 -0
  240. sqlspec/builder/__init__.py +179 -0
  241. sqlspec/builder/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  242. sqlspec/builder/_base.py +1022 -0
  243. sqlspec/builder/_column.cpython-310-aarch64-linux-gnu.so +0 -0
  244. sqlspec/builder/_column.py +521 -0
  245. sqlspec/builder/_ddl.cpython-310-aarch64-linux-gnu.so +0 -0
  246. sqlspec/builder/_ddl.py +1642 -0
  247. sqlspec/builder/_delete.cpython-310-aarch64-linux-gnu.so +0 -0
  248. sqlspec/builder/_delete.py +95 -0
  249. sqlspec/builder/_dml.cpython-310-aarch64-linux-gnu.so +0 -0
  250. sqlspec/builder/_dml.py +365 -0
  251. sqlspec/builder/_explain.cpython-310-aarch64-linux-gnu.so +0 -0
  252. sqlspec/builder/_explain.py +579 -0
  253. sqlspec/builder/_expression_wrappers.cpython-310-aarch64-linux-gnu.so +0 -0
  254. sqlspec/builder/_expression_wrappers.py +46 -0
  255. sqlspec/builder/_factory.cpython-310-aarch64-linux-gnu.so +0 -0
  256. sqlspec/builder/_factory.py +1697 -0
  257. sqlspec/builder/_insert.cpython-310-aarch64-linux-gnu.so +0 -0
  258. sqlspec/builder/_insert.py +328 -0
  259. sqlspec/builder/_join.cpython-310-aarch64-linux-gnu.so +0 -0
  260. sqlspec/builder/_join.py +499 -0
  261. sqlspec/builder/_merge.cpython-310-aarch64-linux-gnu.so +0 -0
  262. sqlspec/builder/_merge.py +821 -0
  263. sqlspec/builder/_parsing_utils.cpython-310-aarch64-linux-gnu.so +0 -0
  264. sqlspec/builder/_parsing_utils.py +297 -0
  265. sqlspec/builder/_select.cpython-310-aarch64-linux-gnu.so +0 -0
  266. sqlspec/builder/_select.py +1660 -0
  267. sqlspec/builder/_temporal.cpython-310-aarch64-linux-gnu.so +0 -0
  268. sqlspec/builder/_temporal.py +139 -0
  269. sqlspec/builder/_update.cpython-310-aarch64-linux-gnu.so +0 -0
  270. sqlspec/builder/_update.py +173 -0
  271. sqlspec/builder/_vector_expressions.py +267 -0
  272. sqlspec/cli.py +911 -0
  273. sqlspec/config.py +1755 -0
  274. sqlspec/core/__init__.py +374 -0
  275. sqlspec/core/_correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  276. sqlspec/core/_correlation.py +176 -0
  277. sqlspec/core/cache.cpython-310-aarch64-linux-gnu.so +0 -0
  278. sqlspec/core/cache.py +1069 -0
  279. sqlspec/core/compiler.cpython-310-aarch64-linux-gnu.so +0 -0
  280. sqlspec/core/compiler.py +954 -0
  281. sqlspec/core/explain.cpython-310-aarch64-linux-gnu.so +0 -0
  282. sqlspec/core/explain.py +275 -0
  283. sqlspec/core/filters.cpython-310-aarch64-linux-gnu.so +0 -0
  284. sqlspec/core/filters.py +952 -0
  285. sqlspec/core/hashing.cpython-310-aarch64-linux-gnu.so +0 -0
  286. sqlspec/core/hashing.py +262 -0
  287. sqlspec/core/metrics.cpython-310-aarch64-linux-gnu.so +0 -0
  288. sqlspec/core/metrics.py +83 -0
  289. sqlspec/core/parameters/__init__.py +71 -0
  290. sqlspec/core/parameters/_alignment.cpython-310-aarch64-linux-gnu.so +0 -0
  291. sqlspec/core/parameters/_alignment.py +270 -0
  292. sqlspec/core/parameters/_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  293. sqlspec/core/parameters/_converter.py +543 -0
  294. sqlspec/core/parameters/_processor.cpython-310-aarch64-linux-gnu.so +0 -0
  295. sqlspec/core/parameters/_processor.py +505 -0
  296. sqlspec/core/parameters/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  297. sqlspec/core/parameters/_registry.py +206 -0
  298. sqlspec/core/parameters/_transformers.cpython-310-aarch64-linux-gnu.so +0 -0
  299. sqlspec/core/parameters/_transformers.py +292 -0
  300. sqlspec/core/parameters/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  301. sqlspec/core/parameters/_types.py +499 -0
  302. sqlspec/core/parameters/_validator.cpython-310-aarch64-linux-gnu.so +0 -0
  303. sqlspec/core/parameters/_validator.py +180 -0
  304. sqlspec/core/pipeline.cpython-310-aarch64-linux-gnu.so +0 -0
  305. sqlspec/core/pipeline.py +319 -0
  306. sqlspec/core/query_modifiers.cpython-310-aarch64-linux-gnu.so +0 -0
  307. sqlspec/core/query_modifiers.py +437 -0
  308. sqlspec/core/result/__init__.py +23 -0
  309. sqlspec/core/result/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  310. sqlspec/core/result/_base.py +1121 -0
  311. sqlspec/core/result/_io.cpython-310-aarch64-linux-gnu.so +0 -0
  312. sqlspec/core/result/_io.py +28 -0
  313. sqlspec/core/splitter.cpython-310-aarch64-linux-gnu.so +0 -0
  314. sqlspec/core/splitter.py +966 -0
  315. sqlspec/core/stack.cpython-310-aarch64-linux-gnu.so +0 -0
  316. sqlspec/core/stack.py +163 -0
  317. sqlspec/core/statement.cpython-310-aarch64-linux-gnu.so +0 -0
  318. sqlspec/core/statement.py +1503 -0
  319. sqlspec/core/type_converter.cpython-310-aarch64-linux-gnu.so +0 -0
  320. sqlspec/core/type_converter.py +339 -0
  321. sqlspec/data_dictionary/__init__.py +22 -0
  322. sqlspec/data_dictionary/_loader.py +123 -0
  323. sqlspec/data_dictionary/_registry.cpython-310-aarch64-linux-gnu.so +0 -0
  324. sqlspec/data_dictionary/_registry.py +74 -0
  325. sqlspec/data_dictionary/_types.cpython-310-aarch64-linux-gnu.so +0 -0
  326. sqlspec/data_dictionary/_types.py +121 -0
  327. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  328. sqlspec/data_dictionary/dialects/bigquery.cpython-310-aarch64-linux-gnu.so +0 -0
  329. sqlspec/data_dictionary/dialects/bigquery.py +49 -0
  330. sqlspec/data_dictionary/dialects/cockroachdb.cpython-310-aarch64-linux-gnu.so +0 -0
  331. sqlspec/data_dictionary/dialects/cockroachdb.py +43 -0
  332. sqlspec/data_dictionary/dialects/duckdb.cpython-310-aarch64-linux-gnu.so +0 -0
  333. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  334. sqlspec/data_dictionary/dialects/mysql.cpython-310-aarch64-linux-gnu.so +0 -0
  335. sqlspec/data_dictionary/dialects/mysql.py +42 -0
  336. sqlspec/data_dictionary/dialects/oracle.cpython-310-aarch64-linux-gnu.so +0 -0
  337. sqlspec/data_dictionary/dialects/oracle.py +34 -0
  338. sqlspec/data_dictionary/dialects/postgres.cpython-310-aarch64-linux-gnu.so +0 -0
  339. sqlspec/data_dictionary/dialects/postgres.py +46 -0
  340. sqlspec/data_dictionary/dialects/spanner.cpython-310-aarch64-linux-gnu.so +0 -0
  341. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  342. sqlspec/data_dictionary/dialects/sqlite.cpython-310-aarch64-linux-gnu.so +0 -0
  343. sqlspec/data_dictionary/dialects/sqlite.py +42 -0
  344. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  345. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  346. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  347. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  348. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  349. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  350. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  351. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  352. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  353. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  354. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  355. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  356. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  357. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  358. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  359. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  360. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  361. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  362. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  363. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  364. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  365. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  366. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  367. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  368. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  369. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  370. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  371. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  372. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  373. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  374. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  375. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  376. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  377. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  378. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  379. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  380. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  381. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  382. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  383. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  384. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  385. sqlspec/driver/__init__.py +32 -0
  386. sqlspec/driver/_async.cpython-310-aarch64-linux-gnu.so +0 -0
  387. sqlspec/driver/_async.py +1737 -0
  388. sqlspec/driver/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  389. sqlspec/driver/_common.py +1478 -0
  390. sqlspec/driver/_sql_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  391. sqlspec/driver/_sql_helpers.py +148 -0
  392. sqlspec/driver/_storage_helpers.cpython-310-aarch64-linux-gnu.so +0 -0
  393. sqlspec/driver/_storage_helpers.py +144 -0
  394. sqlspec/driver/_sync.cpython-310-aarch64-linux-gnu.so +0 -0
  395. sqlspec/driver/_sync.py +1710 -0
  396. sqlspec/exceptions.py +338 -0
  397. sqlspec/extensions/__init__.py +0 -0
  398. sqlspec/extensions/adk/__init__.py +70 -0
  399. sqlspec/extensions/adk/_types.py +51 -0
  400. sqlspec/extensions/adk/converters.py +172 -0
  401. sqlspec/extensions/adk/memory/__init__.py +69 -0
  402. sqlspec/extensions/adk/memory/_types.py +30 -0
  403. sqlspec/extensions/adk/memory/converters.py +149 -0
  404. sqlspec/extensions/adk/memory/service.py +217 -0
  405. sqlspec/extensions/adk/memory/store.py +569 -0
  406. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +246 -0
  407. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  408. sqlspec/extensions/adk/service.py +225 -0
  409. sqlspec/extensions/adk/store.py +567 -0
  410. sqlspec/extensions/events/__init__.py +51 -0
  411. sqlspec/extensions/events/_channel.py +703 -0
  412. sqlspec/extensions/events/_hints.py +45 -0
  413. sqlspec/extensions/events/_models.py +23 -0
  414. sqlspec/extensions/events/_payload.py +69 -0
  415. sqlspec/extensions/events/_protocols.py +134 -0
  416. sqlspec/extensions/events/_queue.py +461 -0
  417. sqlspec/extensions/events/_store.py +209 -0
  418. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  419. sqlspec/extensions/events/migrations/__init__.py +3 -0
  420. sqlspec/extensions/fastapi/__init__.py +19 -0
  421. sqlspec/extensions/fastapi/extension.py +351 -0
  422. sqlspec/extensions/fastapi/providers.py +607 -0
  423. sqlspec/extensions/flask/__init__.py +37 -0
  424. sqlspec/extensions/flask/_state.py +76 -0
  425. sqlspec/extensions/flask/_utils.py +71 -0
  426. sqlspec/extensions/flask/extension.py +519 -0
  427. sqlspec/extensions/litestar/__init__.py +28 -0
  428. sqlspec/extensions/litestar/_utils.py +52 -0
  429. sqlspec/extensions/litestar/channels.py +165 -0
  430. sqlspec/extensions/litestar/cli.py +102 -0
  431. sqlspec/extensions/litestar/config.py +90 -0
  432. sqlspec/extensions/litestar/handlers.py +316 -0
  433. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  434. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  435. sqlspec/extensions/litestar/plugin.py +671 -0
  436. sqlspec/extensions/litestar/providers.py +526 -0
  437. sqlspec/extensions/litestar/store.py +296 -0
  438. sqlspec/extensions/otel/__init__.py +58 -0
  439. sqlspec/extensions/prometheus/__init__.py +113 -0
  440. sqlspec/extensions/starlette/__init__.py +19 -0
  441. sqlspec/extensions/starlette/_state.py +30 -0
  442. sqlspec/extensions/starlette/_utils.py +96 -0
  443. sqlspec/extensions/starlette/extension.py +346 -0
  444. sqlspec/extensions/starlette/middleware.py +235 -0
  445. sqlspec/loader.cpython-310-aarch64-linux-gnu.so +0 -0
  446. sqlspec/loader.py +702 -0
  447. sqlspec/migrations/__init__.py +36 -0
  448. sqlspec/migrations/base.py +731 -0
  449. sqlspec/migrations/commands.py +1232 -0
  450. sqlspec/migrations/context.py +157 -0
  451. sqlspec/migrations/fix.py +204 -0
  452. sqlspec/migrations/loaders.py +443 -0
  453. sqlspec/migrations/runner.py +1172 -0
  454. sqlspec/migrations/templates.py +234 -0
  455. sqlspec/migrations/tracker.py +611 -0
  456. sqlspec/migrations/utils.py +256 -0
  457. sqlspec/migrations/validation.py +207 -0
  458. sqlspec/migrations/version.py +446 -0
  459. sqlspec/observability/__init__.py +55 -0
  460. sqlspec/observability/_common.cpython-310-aarch64-linux-gnu.so +0 -0
  461. sqlspec/observability/_common.py +77 -0
  462. sqlspec/observability/_config.cpython-310-aarch64-linux-gnu.so +0 -0
  463. sqlspec/observability/_config.py +348 -0
  464. sqlspec/observability/_diagnostics.cpython-310-aarch64-linux-gnu.so +0 -0
  465. sqlspec/observability/_diagnostics.py +74 -0
  466. sqlspec/observability/_dispatcher.cpython-310-aarch64-linux-gnu.so +0 -0
  467. sqlspec/observability/_dispatcher.py +152 -0
  468. sqlspec/observability/_formatters/__init__.py +13 -0
  469. sqlspec/observability/_formatters/_aws.cpython-310-aarch64-linux-gnu.so +0 -0
  470. sqlspec/observability/_formatters/_aws.py +102 -0
  471. sqlspec/observability/_formatters/_azure.cpython-310-aarch64-linux-gnu.so +0 -0
  472. sqlspec/observability/_formatters/_azure.py +96 -0
  473. sqlspec/observability/_formatters/_base.cpython-310-aarch64-linux-gnu.so +0 -0
  474. sqlspec/observability/_formatters/_base.py +57 -0
  475. sqlspec/observability/_formatters/_gcp.cpython-310-aarch64-linux-gnu.so +0 -0
  476. sqlspec/observability/_formatters/_gcp.py +131 -0
  477. sqlspec/observability/_formatting.py +58 -0
  478. sqlspec/observability/_observer.cpython-310-aarch64-linux-gnu.so +0 -0
  479. sqlspec/observability/_observer.py +357 -0
  480. sqlspec/observability/_runtime.cpython-310-aarch64-linux-gnu.so +0 -0
  481. sqlspec/observability/_runtime.py +420 -0
  482. sqlspec/observability/_sampling.cpython-310-aarch64-linux-gnu.so +0 -0
  483. sqlspec/observability/_sampling.py +188 -0
  484. sqlspec/observability/_spans.cpython-310-aarch64-linux-gnu.so +0 -0
  485. sqlspec/observability/_spans.py +161 -0
  486. sqlspec/protocols.py +916 -0
  487. sqlspec/py.typed +0 -0
  488. sqlspec/storage/__init__.py +48 -0
  489. sqlspec/storage/_utils.py +104 -0
  490. sqlspec/storage/backends/__init__.py +1 -0
  491. sqlspec/storage/backends/base.py +253 -0
  492. sqlspec/storage/backends/fsspec.py +529 -0
  493. sqlspec/storage/backends/local.py +441 -0
  494. sqlspec/storage/backends/obstore.py +916 -0
  495. sqlspec/storage/errors.py +104 -0
  496. sqlspec/storage/pipeline.py +582 -0
  497. sqlspec/storage/registry.py +301 -0
  498. sqlspec/typing.py +395 -0
  499. sqlspec/utils/__init__.py +7 -0
  500. sqlspec/utils/arrow_helpers.py +318 -0
  501. sqlspec/utils/config_tools.py +332 -0
  502. sqlspec/utils/correlation.cpython-310-aarch64-linux-gnu.so +0 -0
  503. sqlspec/utils/correlation.py +134 -0
  504. sqlspec/utils/deprecation.py +190 -0
  505. sqlspec/utils/fixtures.cpython-310-aarch64-linux-gnu.so +0 -0
  506. sqlspec/utils/fixtures.py +258 -0
  507. sqlspec/utils/logging.py +222 -0
  508. sqlspec/utils/module_loader.py +306 -0
  509. sqlspec/utils/portal.cpython-310-aarch64-linux-gnu.so +0 -0
  510. sqlspec/utils/portal.py +375 -0
  511. sqlspec/utils/schema.cpython-310-aarch64-linux-gnu.so +0 -0
  512. sqlspec/utils/schema.py +485 -0
  513. sqlspec/utils/serializers.cpython-310-aarch64-linux-gnu.so +0 -0
  514. sqlspec/utils/serializers.py +408 -0
  515. sqlspec/utils/singleton.cpython-310-aarch64-linux-gnu.so +0 -0
  516. sqlspec/utils/singleton.py +41 -0
  517. sqlspec/utils/sync_tools.cpython-310-aarch64-linux-gnu.so +0 -0
  518. sqlspec/utils/sync_tools.py +311 -0
  519. sqlspec/utils/text.cpython-310-aarch64-linux-gnu.so +0 -0
  520. sqlspec/utils/text.py +108 -0
  521. sqlspec/utils/type_converters.cpython-310-aarch64-linux-gnu.so +0 -0
  522. sqlspec/utils/type_converters.py +128 -0
  523. sqlspec/utils/type_guards.cpython-310-aarch64-linux-gnu.so +0 -0
  524. sqlspec/utils/type_guards.py +1360 -0
  525. sqlspec/utils/uuids.cpython-310-aarch64-linux-gnu.so +0 -0
  526. sqlspec/utils/uuids.py +225 -0
  527. sqlspec-0.36.0.dist-info/METADATA +205 -0
  528. sqlspec-0.36.0.dist-info/RECORD +531 -0
  529. sqlspec-0.36.0.dist-info/WHEEL +7 -0
  530. sqlspec-0.36.0.dist-info/entry_points.txt +2 -0
  531. sqlspec-0.36.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,71 @@
1
+ """PyMySQL adapter type definitions.
2
+
3
+ This module contains type aliases and classes that are excluded from mypyc
4
+ compilation to avoid ABI boundary issues.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any
8
+
9
+ import pymysql
10
+
11
+ if TYPE_CHECKING:
12
+ from collections.abc import Callable
13
+ from typing import TypeAlias
14
+
15
+ from sqlspec.adapters.pymysql.driver import PyMysqlDriver
16
+ from sqlspec.core import StatementConfig
17
+
18
+ PyMysqlConnection: TypeAlias = pymysql.connections.Connection
19
+
20
+ if not TYPE_CHECKING:
21
+ PyMysqlConnection = pymysql.connections.Connection
22
+
23
+
24
+ class PyMysqlSessionContext:
25
+ """Sync context manager for PyMySQL sessions."""
26
+
27
+ __slots__ = (
28
+ "_acquire_connection",
29
+ "_connection",
30
+ "_driver",
31
+ "_driver_features",
32
+ "_prepare_driver",
33
+ "_release_connection",
34
+ "_statement_config",
35
+ )
36
+
37
+ def __init__(
38
+ self,
39
+ acquire_connection: "Callable[[], Any]",
40
+ release_connection: "Callable[[Any], Any]",
41
+ statement_config: "StatementConfig",
42
+ driver_features: "dict[str, Any]",
43
+ prepare_driver: "Callable[[PyMysqlDriver], PyMysqlDriver]",
44
+ ) -> None:
45
+ self._acquire_connection = acquire_connection
46
+ self._release_connection = release_connection
47
+ self._statement_config = statement_config
48
+ self._driver_features = driver_features
49
+ self._prepare_driver = prepare_driver
50
+ self._connection: Any = None
51
+ self._driver: PyMysqlDriver | None = None
52
+
53
+ def __enter__(self) -> "PyMysqlDriver":
54
+ from sqlspec.adapters.pymysql.driver import PyMysqlDriver
55
+
56
+ self._connection = self._acquire_connection()
57
+ self._driver = PyMysqlDriver(
58
+ connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
59
+ )
60
+ return self._prepare_driver(self._driver)
61
+
62
+ def __exit__(
63
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: Any
64
+ ) -> "bool | None":
65
+ if self._connection is not None:
66
+ self._release_connection(self._connection)
67
+ self._connection = None
68
+ return None
69
+
70
+
71
+ __all__ = ("PyMysqlConnection", "PyMysqlSessionContext")
@@ -0,0 +1,5 @@
1
+ """ADK helpers for the PyMySQL adapter."""
2
+
3
+ from sqlspec.adapters.pymysql.adk.store import PyMysqlADKMemoryStore, PyMysqlADKStore
4
+
5
+ __all__ = ("PyMysqlADKMemoryStore", "PyMysqlADKStore")
@@ -0,0 +1,540 @@
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 BaseSyncADKStore, EventRecord, SessionRecord
9
+ from sqlspec.extensions.adk.memory.store import BaseSyncADKMemoryStore
10
+ from sqlspec.utils.serializers import from_json, to_json
11
+
12
+ if TYPE_CHECKING:
13
+ from datetime import datetime
14
+
15
+ from sqlspec.adapters.pymysql.config import PyMysqlConfig
16
+ from sqlspec.extensions.adk import MemoryRecord
17
+
18
+
19
+ __all__ = ("PyMysqlADKMemoryStore", "PyMysqlADKStore")
20
+
21
+ MYSQL_TABLE_NOT_FOUND_ERROR: Final = 1146
22
+
23
+
24
+ def _parse_owner_id_column_for_mysql(column_ddl: str) -> "tuple[str, str]":
25
+ references_match = re.search(r"\s+REFERENCES\s+(.+)", column_ddl, re.IGNORECASE)
26
+ if not references_match:
27
+ return (column_ddl.strip(), "")
28
+
29
+ col_def = column_ddl[: references_match.start()].strip()
30
+ fk_clause = references_match.group(1).strip()
31
+ col_name = col_def.split()[0]
32
+ fk_constraint = f"FOREIGN KEY ({col_name}) REFERENCES {fk_clause}"
33
+ return (col_def, fk_constraint)
34
+
35
+
36
+ class PyMysqlADKStore(BaseSyncADKStore["PyMysqlConfig"]):
37
+ """MySQL/MariaDB ADK store using PyMySQL."""
38
+
39
+ __slots__ = ()
40
+
41
+ def __init__(self, config: "PyMysqlConfig") -> None:
42
+ super().__init__(config)
43
+
44
+ def _parse_owner_id_column_for_mysql(self, column_ddl: str) -> "tuple[str, str]":
45
+ return _parse_owner_id_column_for_mysql(column_ddl)
46
+
47
+ def _get_create_sessions_table_sql(self) -> str:
48
+ owner_id_col = ""
49
+ fk_constraint = ""
50
+
51
+ if self._owner_id_column_ddl:
52
+ col_def, fk_def = self._parse_owner_id_column_for_mysql(self._owner_id_column_ddl)
53
+ owner_id_col = f"{col_def},"
54
+ if fk_def:
55
+ fk_constraint = f",\n {fk_def}"
56
+
57
+ return f"""
58
+ CREATE TABLE IF NOT EXISTS {self._session_table} (
59
+ id VARCHAR(128) PRIMARY KEY,
60
+ app_name VARCHAR(128) NOT NULL,
61
+ user_id VARCHAR(128) NOT NULL,
62
+ {owner_id_col}
63
+ state JSON NOT NULL,
64
+ create_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
65
+ update_time TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
66
+ INDEX idx_{self._session_table}_app_user (app_name, user_id),
67
+ INDEX idx_{self._session_table}_update_time (update_time DESC){fk_constraint}
68
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
69
+ """
70
+
71
+ def _get_create_events_table_sql(self) -> str:
72
+ return f"""
73
+ CREATE TABLE IF NOT EXISTS {self._events_table} (
74
+ id VARCHAR(128) PRIMARY KEY,
75
+ session_id VARCHAR(128) NOT NULL,
76
+ app_name VARCHAR(128) NOT NULL,
77
+ user_id VARCHAR(128) NOT NULL,
78
+ invocation_id VARCHAR(256) NOT NULL,
79
+ author VARCHAR(256) NOT NULL,
80
+ actions BLOB NOT NULL,
81
+ long_running_tool_ids_json JSON,
82
+ branch VARCHAR(256),
83
+ timestamp TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
84
+ content JSON,
85
+ grounding_metadata JSON,
86
+ custom_metadata JSON,
87
+ partial BOOLEAN,
88
+ turn_complete BOOLEAN,
89
+ interrupted BOOLEAN,
90
+ error_code VARCHAR(256),
91
+ error_message VARCHAR(1024),
92
+ FOREIGN KEY (session_id) REFERENCES {self._session_table}(id) ON DELETE CASCADE,
93
+ INDEX idx_{self._events_table}_session (session_id, timestamp ASC)
94
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
95
+ """
96
+
97
+ def _get_drop_tables_sql(self) -> "list[str]":
98
+ return [f"DROP TABLE IF EXISTS {self._events_table}", f"DROP TABLE IF EXISTS {self._session_table}"]
99
+
100
+ def create_tables(self) -> None:
101
+ with self._config.provide_session() as driver:
102
+ driver.execute_script(self._get_create_sessions_table_sql())
103
+ driver.execute_script(self._get_create_events_table_sql())
104
+
105
+ def create_session(
106
+ self, session_id: str, app_name: str, user_id: str, state: "dict[str, Any]", owner_id: "Any | None" = None
107
+ ) -> SessionRecord:
108
+ state_json = to_json(state)
109
+
110
+ params: tuple[Any, ...]
111
+ if self._owner_id_column_name:
112
+ sql = f"""
113
+ INSERT INTO {self._session_table} (id, app_name, user_id, {self._owner_id_column_name}, state, create_time, update_time)
114
+ VALUES (%s, %s, %s, %s, %s, UTC_TIMESTAMP(6), UTC_TIMESTAMP(6))
115
+ """
116
+ params = (session_id, app_name, user_id, owner_id, state_json)
117
+ else:
118
+ sql = f"""
119
+ INSERT INTO {self._session_table} (id, app_name, user_id, state, create_time, update_time)
120
+ VALUES (%s, %s, %s, %s, UTC_TIMESTAMP(6), UTC_TIMESTAMP(6))
121
+ """
122
+ params = (session_id, app_name, user_id, state_json)
123
+
124
+ with self._config.provide_connection() as conn:
125
+ cursor = conn.cursor()
126
+ try:
127
+ cursor.execute(sql, params)
128
+ finally:
129
+ cursor.close()
130
+ conn.commit()
131
+
132
+ result = self.get_session(session_id)
133
+ if result is None:
134
+ msg = "Failed to fetch created session"
135
+ raise RuntimeError(msg)
136
+ return result
137
+
138
+ def get_session(self, session_id: str) -> "SessionRecord | None":
139
+ sql = f"""
140
+ SELECT id, app_name, user_id, state, create_time, update_time
141
+ FROM {self._session_table}
142
+ WHERE id = %s
143
+ """
144
+
145
+ try:
146
+ with self._config.provide_connection() as conn:
147
+ cursor = conn.cursor()
148
+ try:
149
+ cursor.execute(sql, (session_id,))
150
+ row = cursor.fetchone()
151
+ finally:
152
+ cursor.close()
153
+
154
+ if row is None:
155
+ return None
156
+
157
+ session_id_val, app_name, user_id, state_json, create_time, update_time = row
158
+
159
+ return SessionRecord(
160
+ id=session_id_val,
161
+ app_name=app_name,
162
+ user_id=user_id,
163
+ state=from_json(state_json) if isinstance(state_json, str) else state_json,
164
+ create_time=create_time,
165
+ update_time=update_time,
166
+ )
167
+ except pymysql.MySQLError as exc:
168
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
169
+ return None
170
+ raise
171
+
172
+ def update_session_state(self, session_id: str, state: "dict[str, Any]") -> None:
173
+ state_json = to_json(state)
174
+
175
+ sql = f"""
176
+ UPDATE {self._session_table}
177
+ SET state = %s
178
+ WHERE id = %s
179
+ """
180
+
181
+ with self._config.provide_connection() as conn:
182
+ cursor = conn.cursor()
183
+ try:
184
+ cursor.execute(sql, (state_json, session_id))
185
+ finally:
186
+ cursor.close()
187
+ conn.commit()
188
+
189
+ def delete_session(self, session_id: str) -> None:
190
+ sql = f"DELETE FROM {self._session_table} WHERE id = %s"
191
+
192
+ with self._config.provide_connection() as conn:
193
+ cursor = conn.cursor()
194
+ try:
195
+ cursor.execute(sql, (session_id,))
196
+ finally:
197
+ cursor.close()
198
+ conn.commit()
199
+
200
+ def list_sessions(self, app_name: str, user_id: str | None = None) -> "list[SessionRecord]":
201
+ if user_id is None:
202
+ sql = f"""
203
+ SELECT id, app_name, user_id, state, create_time, update_time
204
+ FROM {self._session_table}
205
+ WHERE app_name = %s
206
+ ORDER BY update_time DESC
207
+ """
208
+ params: tuple[str, ...] = (app_name,)
209
+ else:
210
+ sql = f"""
211
+ SELECT id, app_name, user_id, state, create_time, update_time
212
+ FROM {self._session_table}
213
+ WHERE app_name = %s AND user_id = %s
214
+ ORDER BY update_time DESC
215
+ """
216
+ params = (app_name, user_id)
217
+
218
+ try:
219
+ with self._config.provide_connection() as conn:
220
+ cursor = conn.cursor()
221
+ try:
222
+ cursor.execute(sql, params)
223
+ rows = cursor.fetchall()
224
+ finally:
225
+ cursor.close()
226
+
227
+ return [
228
+ SessionRecord(
229
+ id=row[0],
230
+ app_name=row[1],
231
+ user_id=row[2],
232
+ state=from_json(row[3]) if isinstance(row[3], str) else row[3],
233
+ create_time=row[4],
234
+ update_time=row[5],
235
+ )
236
+ for row in rows
237
+ ]
238
+ except pymysql.MySQLError as exc:
239
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
240
+ return []
241
+ raise
242
+
243
+ def append_event(self, event_record: EventRecord) -> None:
244
+ content_json = to_json(event_record.get("content")) if event_record.get("content") else None
245
+ grounding_metadata_json = (
246
+ to_json(event_record.get("grounding_metadata")) if event_record.get("grounding_metadata") else None
247
+ )
248
+ custom_metadata_json = (
249
+ to_json(event_record.get("custom_metadata")) if event_record.get("custom_metadata") else None
250
+ )
251
+
252
+ sql = f"""
253
+ INSERT INTO {self._events_table} (
254
+ id, session_id, app_name, user_id, invocation_id, author, actions,
255
+ long_running_tool_ids_json, branch, timestamp, content,
256
+ grounding_metadata, custom_metadata, partial, turn_complete,
257
+ interrupted, error_code, error_message
258
+ ) VALUES (
259
+ %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s
260
+ )
261
+ """
262
+
263
+ with self._config.provide_connection() as conn:
264
+ cursor = conn.cursor()
265
+ try:
266
+ cursor.execute(
267
+ sql,
268
+ (
269
+ event_record["id"],
270
+ event_record["session_id"],
271
+ event_record["app_name"],
272
+ event_record["user_id"],
273
+ event_record["invocation_id"],
274
+ event_record["author"],
275
+ event_record["actions"],
276
+ event_record.get("long_running_tool_ids_json"),
277
+ event_record.get("branch"),
278
+ event_record["timestamp"],
279
+ content_json,
280
+ grounding_metadata_json,
281
+ custom_metadata_json,
282
+ event_record.get("partial"),
283
+ event_record.get("turn_complete"),
284
+ event_record.get("interrupted"),
285
+ event_record.get("error_code"),
286
+ event_record.get("error_message"),
287
+ ),
288
+ )
289
+ finally:
290
+ cursor.close()
291
+ conn.commit()
292
+
293
+ def get_events(
294
+ self, session_id: str, after_timestamp: "datetime | None" = None, limit: "int | None" = None
295
+ ) -> "list[EventRecord]":
296
+ where_clauses = ["session_id = %s"]
297
+ params: list[Any] = [session_id]
298
+
299
+ if after_timestamp is not None:
300
+ where_clauses.append("timestamp > %s")
301
+ params.append(after_timestamp)
302
+
303
+ where_clause = " AND ".join(where_clauses)
304
+ limit_clause = f" LIMIT {limit}" if limit else ""
305
+
306
+ sql = f"""
307
+ SELECT id, session_id, app_name, user_id, invocation_id, author, actions,
308
+ long_running_tool_ids_json, branch, timestamp, content,
309
+ grounding_metadata, custom_metadata, partial, turn_complete,
310
+ interrupted, error_code, error_message
311
+ FROM {self._events_table}
312
+ WHERE {where_clause}
313
+ ORDER BY timestamp ASC{limit_clause}
314
+ """
315
+
316
+ try:
317
+ with self._config.provide_connection() as conn:
318
+ cursor = conn.cursor()
319
+ try:
320
+ cursor.execute(sql, params)
321
+ rows = cursor.fetchall()
322
+ finally:
323
+ cursor.close()
324
+
325
+ return [
326
+ EventRecord(
327
+ id=row[0],
328
+ session_id=row[1],
329
+ app_name=row[2],
330
+ user_id=row[3],
331
+ invocation_id=row[4],
332
+ author=row[5],
333
+ actions=bytes(row[6]),
334
+ long_running_tool_ids_json=row[7],
335
+ branch=row[8],
336
+ timestamp=row[9],
337
+ content=from_json(row[10]) if row[10] and isinstance(row[10], str) else row[10],
338
+ grounding_metadata=from_json(row[11]) if row[11] and isinstance(row[11], str) else row[11],
339
+ custom_metadata=from_json(row[12]) if row[12] and isinstance(row[12], str) else row[12],
340
+ partial=row[13],
341
+ turn_complete=row[14],
342
+ interrupted=row[15],
343
+ error_code=row[16],
344
+ error_message=row[17],
345
+ )
346
+ for row in rows
347
+ ]
348
+ except pymysql.MySQLError as exc:
349
+ if "doesn't exist" in str(exc) or getattr(exc, "args", [None])[0] == MYSQL_TABLE_NOT_FOUND_ERROR:
350
+ return []
351
+ raise
352
+
353
+
354
+ class PyMysqlADKMemoryStore(BaseSyncADKMemoryStore["PyMysqlConfig"]):
355
+ """MySQL/MariaDB ADK memory store using PyMySQL."""
356
+
357
+ __slots__ = ()
358
+
359
+ def __init__(self, config: "PyMysqlConfig") -> None:
360
+ super().__init__(config)
361
+
362
+ def _get_create_memory_table_sql(self) -> str:
363
+ owner_id_line = ""
364
+ fk_constraint = ""
365
+ if self._owner_id_column_ddl:
366
+ col_def, fk_def = _parse_owner_id_column_for_mysql(self._owner_id_column_ddl)
367
+ owner_id_line = f",\n {col_def}"
368
+ if fk_def:
369
+ fk_constraint = f",\n {fk_def}"
370
+
371
+ fts_index = ""
372
+ if self._use_fts:
373
+ fts_index = f",\n FULLTEXT INDEX idx_{self._memory_table}_fts (content_text)"
374
+
375
+ return f"""
376
+ CREATE TABLE IF NOT EXISTS {self._memory_table} (
377
+ id VARCHAR(128) PRIMARY KEY,
378
+ session_id VARCHAR(128) NOT NULL,
379
+ app_name VARCHAR(128) NOT NULL,
380
+ user_id VARCHAR(128) NOT NULL,
381
+ event_id VARCHAR(128) NOT NULL UNIQUE,
382
+ author VARCHAR(256){owner_id_line},
383
+ timestamp TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
384
+ content_json JSON NOT NULL,
385
+ content_text TEXT NOT NULL,
386
+ metadata_json JSON,
387
+ inserted_at TIMESTAMP(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
388
+ INDEX idx_{self._memory_table}_app_user_time (app_name, user_id, timestamp),
389
+ INDEX idx_{self._memory_table}_session (session_id){fts_index}{fk_constraint}
390
+ ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
391
+ """
392
+
393
+ def _get_drop_memory_table_sql(self) -> "list[str]":
394
+ return [f"DROP TABLE IF EXISTS {self._memory_table}"]
395
+
396
+ def create_tables(self) -> None:
397
+ if not self._enabled:
398
+ return
399
+
400
+ with self._config.provide_session() as driver:
401
+ driver.execute_script(self._get_create_memory_table_sql())
402
+
403
+ def insert_memory_entries(self, entries: "list[MemoryRecord]", owner_id: "object | None" = None) -> int:
404
+ if not self._enabled:
405
+ msg = "Memory store is disabled"
406
+ raise RuntimeError(msg)
407
+
408
+ if not entries:
409
+ return 0
410
+
411
+ inserted_count = 0
412
+ if self._owner_id_column_name:
413
+ sql = f"""
414
+ INSERT IGNORE INTO {self._memory_table} (
415
+ id, session_id, app_name, user_id, event_id, author,
416
+ {self._owner_id_column_name}, timestamp, content_json,
417
+ content_text, metadata_json, inserted_at
418
+ ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
419
+ """
420
+ else:
421
+ sql = f"""
422
+ INSERT IGNORE INTO {self._memory_table} (
423
+ id, session_id, app_name, user_id, event_id, author,
424
+ timestamp, content_json, content_text, metadata_json, inserted_at
425
+ ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)
426
+ """
427
+
428
+ with self._config.provide_connection() as conn:
429
+ cursor = conn.cursor()
430
+ try:
431
+ for entry in entries:
432
+ params: tuple[Any, ...]
433
+ if self._owner_id_column_name:
434
+ params = (
435
+ entry["id"],
436
+ entry["session_id"],
437
+ entry["app_name"],
438
+ entry["user_id"],
439
+ entry["event_id"],
440
+ entry["author"],
441
+ owner_id,
442
+ entry["timestamp"],
443
+ to_json(entry["content_json"]),
444
+ entry["content_text"],
445
+ to_json(entry["metadata_json"]),
446
+ entry["inserted_at"],
447
+ )
448
+ else:
449
+ params = (
450
+ entry["id"],
451
+ entry["session_id"],
452
+ entry["app_name"],
453
+ entry["user_id"],
454
+ entry["event_id"],
455
+ entry["author"],
456
+ entry["timestamp"],
457
+ to_json(entry["content_json"]),
458
+ entry["content_text"],
459
+ to_json(entry["metadata_json"]),
460
+ entry["inserted_at"],
461
+ )
462
+ cursor.execute(sql, params)
463
+ inserted_count += cursor.rowcount
464
+ finally:
465
+ cursor.close()
466
+ conn.commit()
467
+ return inserted_count
468
+
469
+ def search_entries(
470
+ self, query: str, app_name: str, user_id: str, limit: "int | None" = None
471
+ ) -> "list[MemoryRecord]":
472
+ if not self._enabled:
473
+ msg = "Memory store is disabled"
474
+ raise RuntimeError(msg)
475
+
476
+ if not query:
477
+ return []
478
+
479
+ limit_value = limit or self._max_results
480
+ if self._use_fts:
481
+ sql = f"""
482
+ SELECT * FROM {self._memory_table}
483
+ WHERE app_name = %s AND user_id = %s
484
+ AND MATCH(content_text) AGAINST (%s IN NATURAL LANGUAGE MODE)
485
+ ORDER BY timestamp DESC
486
+ LIMIT %s
487
+ """
488
+ params = (app_name, user_id, query, limit_value)
489
+ else:
490
+ sql = f"""
491
+ SELECT * FROM {self._memory_table}
492
+ WHERE app_name = %s AND user_id = %s AND content_text LIKE %s
493
+ ORDER BY timestamp DESC
494
+ LIMIT %s
495
+ """
496
+ params = (app_name, user_id, f"%{query}%", limit_value)
497
+
498
+ with self._config.provide_connection() as conn:
499
+ cursor = conn.cursor()
500
+ try:
501
+ cursor.execute(sql, params)
502
+ rows = cursor.fetchall()
503
+ columns = [col[0] for col in cursor.description or []]
504
+ finally:
505
+ cursor.close()
506
+
507
+ return [cast("MemoryRecord", dict(zip(columns, row, strict=False))) for row in rows]
508
+
509
+ def delete_entries_by_session(self, session_id: str) -> int:
510
+ if not self._enabled:
511
+ msg = "Memory store is disabled"
512
+ raise RuntimeError(msg)
513
+
514
+ sql = f"DELETE FROM {self._memory_table} WHERE session_id = %s"
515
+ with self._config.provide_connection() as conn:
516
+ cursor = conn.cursor()
517
+ try:
518
+ cursor.execute(sql, (session_id,))
519
+ conn.commit()
520
+ return cursor.rowcount if cursor.rowcount and cursor.rowcount > 0 else 0
521
+ finally:
522
+ cursor.close()
523
+
524
+ def delete_entries_older_than(self, days: int) -> int:
525
+ if not self._enabled:
526
+ msg = "Memory store is disabled"
527
+ raise RuntimeError(msg)
528
+
529
+ sql = f"""
530
+ DELETE FROM {self._memory_table}
531
+ WHERE inserted_at < (UTC_TIMESTAMP(6) - INTERVAL %s DAY)
532
+ """
533
+ with self._config.provide_connection() as conn:
534
+ cursor = conn.cursor()
535
+ try:
536
+ cursor.execute(sql, (days,))
537
+ conn.commit()
538
+ return cursor.rowcount if cursor.rowcount and cursor.rowcount > 0 else 0
539
+ finally:
540
+ cursor.close()