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,502 @@
1
+ """ADBC session store for Litestar integration with multi-dialect support.
2
+
3
+ ADBC (Arrow Database Connectivity) supports multiple database backends including
4
+ PostgreSQL, SQLite, DuckDB, BigQuery, MySQL, and Snowflake. This store automatically
5
+ detects the dialect and adapts SQL syntax accordingly.
6
+
7
+ Supports:
8
+ - PostgreSQL: BYTEA data type, TIMESTAMPTZ, $1 parameters, ON CONFLICT
9
+ - SQLite: BLOB data type, DATETIME, ? parameters, INSERT OR REPLACE
10
+ - DuckDB: BLOB data type, TIMESTAMP, ? parameters, ON CONFLICT
11
+ - MySQL/MariaDB: BLOB data type, DATETIME, %s parameters, ON DUPLICATE KEY UPDATE
12
+ - BigQuery: BYTES data type, TIMESTAMP, @param parameters, MERGE
13
+ - Snowflake: BINARY data type, TIMESTAMP WITH TIME ZONE, ? parameters, MERGE
14
+ """
15
+
16
+ from datetime import datetime, timedelta, timezone
17
+ from typing import TYPE_CHECKING
18
+
19
+ from sqlspec.extensions.litestar.store import BaseSQLSpecStore
20
+ from sqlspec.utils.sync_tools import async_
21
+
22
+ if TYPE_CHECKING:
23
+ from sqlspec.adapters.adbc.config import AdbcConfig
24
+
25
+
26
+ __all__ = ("ADBCStore",)
27
+
28
+
29
+ class ADBCStore(BaseSQLSpecStore["AdbcConfig"]):
30
+ """ADBC session store using synchronous ADBC driver.
31
+
32
+ Implements server-side session storage for Litestar using ADBC
33
+ (Arrow Database Connectivity) via the synchronous driver. Uses
34
+ Litestar's sync_to_thread utility to provide an async interface
35
+ compatible with the Store protocol.
36
+
37
+ ADBC supports multiple database backends (PostgreSQL, SQLite, DuckDB, etc.).
38
+ The SQL schema is optimized for PostgreSQL by default, but can work with
39
+ other backends that support TIMESTAMPTZ and BYTEA equivalents.
40
+
41
+ Provides efficient session management with:
42
+ - Sync operations wrapped for async compatibility
43
+ - INSERT ON CONFLICT (UPSERT) for PostgreSQL
44
+ - Automatic expiration handling with TIMESTAMPTZ
45
+ - Efficient cleanup of expired sessions
46
+
47
+ Args:
48
+ config: AdbcConfig instance.
49
+
50
+ Example:
51
+ from sqlspec.adapters.adbc import AdbcConfig
52
+ from sqlspec.adapters.adbc.litestar.store import ADBCStore
53
+
54
+ config = AdbcConfig(
55
+ connection_config={
56
+ "uri": "postgresql://user:pass@localhost/db"
57
+ }
58
+ )
59
+ store = ADBCStore(config)
60
+ await store.create_table()
61
+ """
62
+
63
+ __slots__ = ("_dialect",)
64
+
65
+ def __init__(self, config: "AdbcConfig") -> None:
66
+ """Initialize ADBC session store.
67
+
68
+ Args:
69
+ config: AdbcConfig instance.
70
+
71
+ Notes:
72
+ Table name is read from config.extension_config["litestar"]["session_table"].
73
+ """
74
+ super().__init__(config)
75
+ self._dialect: str | None = None
76
+
77
+ def _get_dialect(self) -> str:
78
+ """Get the database dialect, caching it after first access.
79
+
80
+ Returns:
81
+ Dialect name (postgres, sqlite, duckdb, mysql, bigquery, snowflake).
82
+ """
83
+ if self._dialect is not None:
84
+ return self._dialect
85
+
86
+ with self._config.provide_session() as driver:
87
+ dialect_value = driver.dialect
88
+ self._dialect = str(dialect_value) if dialect_value else "postgres"
89
+
90
+ assert self._dialect is not None
91
+ return self._dialect
92
+
93
+ def _get_create_table_sql(self) -> str:
94
+ """Get dialect-specific CREATE TABLE SQL for ADBC.
95
+
96
+ Returns:
97
+ SQL statement to create the sessions table with proper indexes.
98
+
99
+ Notes:
100
+ Automatically adapts to the detected database dialect:
101
+ - PostgreSQL: BYTEA, TIMESTAMPTZ with partial index
102
+ - SQLite: BLOB, DATETIME
103
+ - DuckDB: BLOB, TIMESTAMP
104
+ - MySQL/MariaDB: BLOB, DATETIME
105
+ - BigQuery: BYTES, TIMESTAMP
106
+ - Snowflake: BINARY, TIMESTAMP WITH TIME ZONE
107
+ """
108
+ dialect = self._get_dialect()
109
+
110
+ if dialect in {"postgres", "postgresql"}:
111
+ return f"""
112
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
113
+ session_id TEXT PRIMARY KEY,
114
+ data BYTEA NOT NULL,
115
+ expires_at TIMESTAMPTZ
116
+ );
117
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
118
+ ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
119
+ """
120
+
121
+ if dialect == "sqlite":
122
+ return f"""
123
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
124
+ session_id TEXT PRIMARY KEY,
125
+ data BLOB NOT NULL,
126
+ expires_at DATETIME
127
+ );
128
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
129
+ ON {self._table_name}(expires_at);
130
+ """
131
+
132
+ if dialect == "duckdb":
133
+ return f"""
134
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
135
+ session_id VARCHAR PRIMARY KEY,
136
+ data BLOB NOT NULL,
137
+ expires_at TIMESTAMP
138
+ );
139
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
140
+ ON {self._table_name}(expires_at);
141
+ """
142
+
143
+ if dialect in {"mysql", "mariadb"}:
144
+ return f"""
145
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
146
+ session_id VARCHAR(255) PRIMARY KEY,
147
+ data BLOB NOT NULL,
148
+ expires_at DATETIME
149
+ );
150
+ CREATE INDEX idx_{self._table_name}_expires_at
151
+ ON {self._table_name}(expires_at);
152
+ """
153
+
154
+ if dialect == "bigquery":
155
+ return f"""
156
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
157
+ session_id STRING NOT NULL,
158
+ data BYTES NOT NULL,
159
+ expires_at TIMESTAMP
160
+ );
161
+ CREATE INDEX idx_{self._table_name}_expires_at
162
+ ON {self._table_name}(expires_at);
163
+ """
164
+
165
+ if dialect == "snowflake":
166
+ return f"""
167
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
168
+ session_id VARCHAR(255) PRIMARY KEY,
169
+ data BINARY NOT NULL,
170
+ expires_at TIMESTAMP WITH TIME ZONE
171
+ );
172
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
173
+ ON {self._table_name}(expires_at);
174
+ """
175
+
176
+ return f"""
177
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
178
+ session_id TEXT PRIMARY KEY,
179
+ data BYTEA NOT NULL,
180
+ expires_at TIMESTAMPTZ
181
+ );
182
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
183
+ ON {self._table_name}(expires_at);
184
+ """
185
+
186
+ def _get_param_placeholder(self, position: int) -> str:
187
+ """Get the parameter placeholder syntax for the current dialect.
188
+
189
+ Args:
190
+ position: 1-based parameter position.
191
+
192
+ Returns:
193
+ Parameter placeholder string (e.g., '$1', '?', '%s', '@param1').
194
+ """
195
+ dialect = self._get_dialect()
196
+
197
+ if dialect in {"postgres", "postgresql"}:
198
+ return f"${position}"
199
+ if dialect in {"mysql", "mariadb"}:
200
+ return "%s"
201
+ if dialect == "bigquery":
202
+ return f"@param{position}"
203
+ return "?"
204
+
205
+ def _get_current_timestamp_expr(self) -> str:
206
+ """Get the current timestamp expression for the current dialect.
207
+
208
+ Returns:
209
+ SQL expression for getting current timestamp with timezone.
210
+ """
211
+ dialect = self._get_dialect()
212
+
213
+ if dialect in {"postgres", "postgresql"}:
214
+ return "CURRENT_TIMESTAMP AT TIME ZONE 'UTC'"
215
+ if dialect in {"mysql", "mariadb"}:
216
+ return "UTC_TIMESTAMP()"
217
+ if dialect == "bigquery":
218
+ return "CURRENT_TIMESTAMP()"
219
+ if dialect == "snowflake":
220
+ return "CONVERT_TIMEZONE('UTC', CURRENT_TIMESTAMP())"
221
+ return "CURRENT_TIMESTAMP"
222
+
223
+ def _create_table(self) -> None:
224
+ """Synchronous implementation of create_table using ADBC driver."""
225
+ sql_text = self._get_create_table_sql()
226
+ with self._config.provide_session() as driver:
227
+ driver.execute_script(sql_text)
228
+ driver.commit()
229
+ self._log_table_created()
230
+
231
+ def _get_drop_table_sql(self) -> "list[str]":
232
+ """Get dialect-specific DROP TABLE SQL statements for ADBC.
233
+
234
+ Returns:
235
+ List of SQL statements to drop indexes and table.
236
+ """
237
+ dialect = self._get_dialect()
238
+
239
+ if dialect in {"mysql", "mariadb"}:
240
+ return [
241
+ f"DROP INDEX idx_{self._table_name}_expires_at ON {self._table_name}",
242
+ f"DROP TABLE IF EXISTS {self._table_name}",
243
+ ]
244
+
245
+ return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
246
+
247
+ async def create_table(self) -> None:
248
+ """Create the session table if it doesn't exist."""
249
+ await async_(self._create_table)()
250
+
251
+ def _get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
252
+ """Synchronous implementation of get using ADBC driver."""
253
+ p1 = self._get_param_placeholder(1)
254
+ current_ts = self._get_current_timestamp_expr()
255
+
256
+ sql = f"""
257
+ SELECT data, expires_at FROM {self._table_name}
258
+ WHERE session_id = {p1}
259
+ AND (expires_at IS NULL OR expires_at > {current_ts})
260
+ """
261
+
262
+ with self._config.provide_session() as driver:
263
+ result = driver.select_one_or_none(sql, key)
264
+
265
+ if result is None:
266
+ return None
267
+
268
+ data = result["data"]
269
+ expires_at = result["expires_at"]
270
+
271
+ if renew_for is not None and expires_at is not None:
272
+ new_expires_at = self._calculate_expires_at(renew_for)
273
+ p1_update = self._get_param_placeholder(1)
274
+ p2_update = self._get_param_placeholder(2)
275
+ update_sql = f"""
276
+ UPDATE {self._table_name}
277
+ SET expires_at = {p1_update}
278
+ WHERE session_id = {p2_update}
279
+ """
280
+ driver.execute(update_sql, new_expires_at, key)
281
+ driver.commit()
282
+
283
+ return bytes(data)
284
+
285
+ async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
286
+ """Get a session value by key.
287
+
288
+ Args:
289
+ key: Session ID to retrieve.
290
+ renew_for: If given, renew the expiry time for this duration.
291
+
292
+ Returns:
293
+ Session data as bytes if found and not expired, None otherwise.
294
+ """
295
+ return await async_(self._get)(key, renew_for)
296
+
297
+ def _set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
298
+ """Synchronous implementation of set using ADBC driver with dialect-specific UPSERT."""
299
+ data = self._value_to_bytes(value)
300
+ expires_at = self._calculate_expires_at(expires_in)
301
+ dialect = self._get_dialect()
302
+
303
+ p1 = self._get_param_placeholder(1)
304
+ p2 = self._get_param_placeholder(2)
305
+ p3 = self._get_param_placeholder(3)
306
+
307
+ if dialect in {"postgres", "postgresql", "sqlite", "duckdb"}:
308
+ if dialect == "sqlite":
309
+ sql = f"""
310
+ INSERT OR REPLACE INTO {self._table_name} (session_id, data, expires_at)
311
+ VALUES ({p1}, {p2}, {p3})
312
+ """
313
+ else:
314
+ sql = f"""
315
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
316
+ VALUES ({p1}, {p2}, {p3})
317
+ ON CONFLICT (session_id) DO UPDATE
318
+ SET data = EXCLUDED.data, expires_at = EXCLUDED.expires_at
319
+ """
320
+ elif dialect in {"mysql", "mariadb"}:
321
+ sql = f"""
322
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
323
+ VALUES ({p1}, {p2}, {p3})
324
+ ON DUPLICATE KEY UPDATE data = VALUES(data), expires_at = VALUES(expires_at)
325
+ """
326
+ elif dialect in {"bigquery", "snowflake"}:
327
+ with self._config.provide_session() as driver:
328
+ check_sql = f"SELECT COUNT(*) as count FROM {self._table_name} WHERE session_id = {p1}"
329
+ result = driver.select_one(check_sql, key)
330
+ exists = result and result.get("count", 0) > 0
331
+
332
+ if exists:
333
+ sql = f"""
334
+ UPDATE {self._table_name}
335
+ SET data = {p1}, expires_at = {p2}
336
+ WHERE session_id = {p3}
337
+ """
338
+ driver.execute(sql, data, expires_at, key)
339
+ else:
340
+ sql = f"""
341
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
342
+ VALUES ({p1}, {p2}, {p3})
343
+ """
344
+ driver.execute(sql, key, data, expires_at)
345
+ driver.commit()
346
+ return
347
+ else:
348
+ sql = f"""
349
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
350
+ VALUES ({p1}, {p2}, {p3})
351
+ ON CONFLICT (session_id) DO UPDATE
352
+ SET data = EXCLUDED.data, expires_at = EXCLUDED.expires_at
353
+ """
354
+
355
+ with self._config.provide_session() as driver:
356
+ driver.execute(sql, key, data, expires_at)
357
+ driver.commit()
358
+
359
+ async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
360
+ """Store a session value.
361
+
362
+ Args:
363
+ key: Session ID.
364
+ value: Session data.
365
+ expires_in: Time until expiration.
366
+ """
367
+ await async_(self._set)(key, value, expires_in)
368
+
369
+ def _delete(self, key: str) -> None:
370
+ """Synchronous implementation of delete using ADBC driver."""
371
+ p1 = self._get_param_placeholder(1)
372
+ sql = f"DELETE FROM {self._table_name} WHERE session_id = {p1}"
373
+
374
+ with self._config.provide_session() as driver:
375
+ driver.execute(sql, key)
376
+ driver.commit()
377
+
378
+ async def delete(self, key: str) -> None:
379
+ """Delete a session by key.
380
+
381
+ Args:
382
+ key: Session ID to delete.
383
+ """
384
+ await async_(self._delete)(key)
385
+
386
+ def _delete_all(self) -> None:
387
+ """Synchronous implementation of delete_all using ADBC driver."""
388
+
389
+ sql = f"DELETE FROM {self._table_name}"
390
+
391
+ with self._config.provide_session() as driver:
392
+ driver.execute(sql)
393
+ driver.commit()
394
+
395
+ async def delete_all(self) -> None:
396
+ """Delete all sessions from the store."""
397
+ await async_(self._delete_all)()
398
+
399
+ def _exists(self, key: str) -> bool:
400
+ """Synchronous implementation of exists using ADBC driver."""
401
+
402
+ p1 = self._get_param_placeholder(1)
403
+ current_ts = self._get_current_timestamp_expr()
404
+
405
+ sql = f"""
406
+ SELECT 1 FROM {self._table_name}
407
+ WHERE session_id = {p1}
408
+ AND (expires_at IS NULL OR expires_at > {current_ts})
409
+ """
410
+
411
+ with self._config.provide_session() as driver:
412
+ return bool(driver.select_one_or_none(sql, key) is not None)
413
+
414
+ async def exists(self, key: str) -> bool:
415
+ """Check if a session key exists and is not expired.
416
+
417
+ Args:
418
+ key: Session ID to check.
419
+
420
+ Returns:
421
+ True if the session exists and is not expired.
422
+ """
423
+ return await async_(self._exists)(key)
424
+
425
+ def _expires_in(self, key: str) -> "int | None":
426
+ """Synchronous implementation of expires_in using ADBC driver."""
427
+ p1 = self._get_param_placeholder(1)
428
+ sql = f"""
429
+ SELECT expires_at FROM {self._table_name}
430
+ WHERE session_id = {p1}
431
+ """
432
+
433
+ with self._config.provide_session() as driver:
434
+ result = driver.select_one(sql, key)
435
+
436
+ if result is None or result.get("expires_at") is None:
437
+ return None
438
+
439
+ expires_at = result["expires_at"]
440
+
441
+ if not isinstance(expires_at, datetime):
442
+ return None
443
+
444
+ if expires_at.tzinfo is None:
445
+ expires_at = expires_at.replace(tzinfo=timezone.utc)
446
+
447
+ now = datetime.now(timezone.utc)
448
+
449
+ if expires_at <= now:
450
+ return 0
451
+
452
+ delta = expires_at - now
453
+ return int(delta.total_seconds())
454
+
455
+ async def expires_in(self, key: str) -> "int | None":
456
+ """Get the time in seconds until the session expires.
457
+
458
+ Args:
459
+ key: Session ID to check.
460
+
461
+ Returns:
462
+ Seconds until expiration, or None if no expiry or key doesn't exist.
463
+ """
464
+ return await async_(self._expires_in)(key)
465
+
466
+ def _delete_expired(self) -> int:
467
+ """Synchronous implementation of delete_expired using ADBC driver."""
468
+ current_ts = self._get_current_timestamp_expr()
469
+ dialect = self._get_dialect()
470
+
471
+ if dialect in {"postgres", "postgresql"}:
472
+ sql = f"DELETE FROM {self._table_name} WHERE expires_at <= {current_ts} RETURNING session_id"
473
+ else:
474
+ count_sql = f"SELECT COUNT(*) as count FROM {self._table_name} WHERE expires_at <= {current_ts}"
475
+ delete_sql = f"DELETE FROM {self._table_name} WHERE expires_at <= {current_ts}"
476
+
477
+ with self._config.provide_session() as driver:
478
+ result = driver.select_one(count_sql)
479
+ count = result.get("count", 0) if result else 0
480
+
481
+ if count > 0:
482
+ driver.execute(delete_sql)
483
+ driver.commit()
484
+ self._log_delete_expired(count)
485
+
486
+ return count
487
+
488
+ with self._config.provide_session() as driver:
489
+ exec_result = driver.execute(sql)
490
+ driver.commit()
491
+ count = exec_result.rows_affected
492
+ if count > 0:
493
+ self._log_delete_expired(count)
494
+ return count
495
+
496
+ async def delete_expired(self) -> int:
497
+ """Delete all expired sessions.
498
+
499
+ Returns:
500
+ Number of sessions deleted.
501
+ """
502
+ return await async_(self._delete_expired)()
@@ -0,0 +1,140 @@
1
+ """ADBC-specific type conversion with multi-dialect support.
2
+
3
+ Provides specialized type handling for ADBC adapters, including dialect-aware
4
+ type conversion for different database backends (PostgreSQL, SQLite, DuckDB,
5
+ MySQL, BigQuery, Snowflake).
6
+ """
7
+
8
+ from typing import Any
9
+
10
+ from sqlspec.core.type_converter import CachedOutputConverter
11
+ from sqlspec.utils.serializers import to_json
12
+
13
+ __all__ = ("ADBC_SPECIAL_CHARS", "ADBCOutputConverter", "get_adbc_type_converter")
14
+
15
+ ADBC_SPECIAL_CHARS: "frozenset[str]" = frozenset({"{", "[", "-", ":", "T", "."})
16
+
17
+ # Native type support by dialect
18
+ _NATIVE_SUPPORT: "dict[str, list[str]]" = {
19
+ "postgres": ["uuid", "json", "interval", "pg_array"],
20
+ "postgresql": ["uuid", "json", "interval", "pg_array"],
21
+ "duckdb": ["uuid", "json"],
22
+ "bigquery": ["json"],
23
+ "sqlite": [],
24
+ "mysql": ["json"],
25
+ "snowflake": ["json"],
26
+ }
27
+
28
+
29
+ class ADBCOutputConverter(CachedOutputConverter):
30
+ """ADBC-specific output conversion with dialect awareness.
31
+
32
+ Extends CachedOutputConverter with ADBC multi-backend functionality
33
+ including dialect-specific type handling for different database systems.
34
+ """
35
+
36
+ __slots__ = ("dialect",)
37
+
38
+ def __init__(self, dialect: str, cache_size: int = 5000) -> None:
39
+ """Initialize with dialect-specific configuration.
40
+
41
+ Args:
42
+ dialect: Target database dialect (postgres, sqlite, duckdb, etc.)
43
+ cache_size: Maximum number of string values to cache (default: 5000)
44
+ """
45
+ super().__init__(special_chars=ADBC_SPECIAL_CHARS, cache_size=cache_size)
46
+ self.dialect = dialect.lower()
47
+
48
+ def _convert_detected(self, value: str, detected_type: str) -> Any:
49
+ """Convert value with dialect-specific handling.
50
+
51
+ Args:
52
+ value: String value to convert.
53
+ detected_type: Detected type name.
54
+
55
+ Returns:
56
+ Converted value according to dialect requirements.
57
+ """
58
+ try:
59
+ if self.dialect in {"postgres", "postgresql"}:
60
+ if detected_type in {"uuid", "interval"}:
61
+ return self.convert_value(value, detected_type)
62
+ elif self.dialect == "duckdb":
63
+ if detected_type == "uuid":
64
+ return self.convert_value(value, detected_type)
65
+ elif self.dialect == "sqlite":
66
+ if detected_type == "uuid":
67
+ return str(value)
68
+ elif self.dialect == "bigquery":
69
+ if detected_type == "uuid":
70
+ return self.convert_value(value, detected_type)
71
+ elif self.dialect in {"mysql", "snowflake"} and detected_type in {"uuid", "json"}:
72
+ return self.convert_value(value, detected_type)
73
+ return self.convert_value(value, detected_type)
74
+ except Exception:
75
+ return value
76
+
77
+ def convert_dict(self, value: "dict[str, Any]") -> Any:
78
+ """Convert dictionary values with dialect-specific handling.
79
+
80
+ Args:
81
+ value: Dictionary to convert.
82
+
83
+ Returns:
84
+ Converted value appropriate for the dialect.
85
+ """
86
+ if self.dialect in {"postgres", "postgresql", "bigquery"}:
87
+ return to_json(value)
88
+ return value
89
+
90
+ def supports_native_type(self, type_name: str) -> bool:
91
+ """Check if dialect supports native handling of a type.
92
+
93
+ Args:
94
+ type_name: Type name to check (e.g., 'uuid', 'json')
95
+
96
+ Returns:
97
+ True if dialect supports native handling, False otherwise.
98
+ """
99
+ return type_name in _NATIVE_SUPPORT.get(self.dialect, [])
100
+
101
+ def get_dialect_specific_converter(self, value: Any, target_type: str) -> Any:
102
+ """Apply dialect-specific conversion logic.
103
+
104
+ Args:
105
+ value: Value to convert.
106
+ target_type: Target type for conversion.
107
+
108
+ Returns:
109
+ Converted value according to dialect requirements.
110
+ """
111
+ if self.dialect in {"postgres", "postgresql"}:
112
+ if target_type in {"uuid", "json", "interval"}:
113
+ return self.convert_value(value, target_type)
114
+ elif self.dialect == "duckdb":
115
+ if target_type in {"uuid", "json"}:
116
+ return self.convert_value(value, target_type)
117
+ elif self.dialect == "sqlite":
118
+ if target_type == "uuid":
119
+ return str(value)
120
+ if target_type == "json":
121
+ return self.convert_value(value, target_type)
122
+ elif self.dialect == "bigquery":
123
+ if target_type == "uuid":
124
+ return str(self.convert_value(value, target_type))
125
+ if target_type == "json":
126
+ return self.convert_value(value, target_type)
127
+ return self.convert_value(value, target_type)
128
+
129
+
130
+ def get_adbc_type_converter(dialect: str, cache_size: int = 5000) -> ADBCOutputConverter:
131
+ """Factory function to create dialect-specific ADBC type converter.
132
+
133
+ Args:
134
+ dialect: Database dialect name.
135
+ cache_size: Maximum number of string values to cache (default: 5000)
136
+
137
+ Returns:
138
+ Configured ADBCOutputConverter instance.
139
+ """
140
+ return ADBCOutputConverter(dialect, cache_size)
@@ -0,0 +1,25 @@
1
+ from sqlspec.adapters.aiosqlite._typing import AiosqliteConnection
2
+ from sqlspec.adapters.aiosqlite.config import AiosqliteConfig, AiosqliteConnectionParams, AiosqlitePoolParams
3
+ from sqlspec.adapters.aiosqlite.core import default_statement_config
4
+ from sqlspec.adapters.aiosqlite.driver import AiosqliteCursor, AiosqliteDriver, AiosqliteExceptionHandler
5
+ from sqlspec.adapters.aiosqlite.pool import (
6
+ AiosqliteConnectionPool,
7
+ AiosqliteConnectTimeoutError,
8
+ AiosqlitePoolClosedError,
9
+ AiosqlitePoolConnection,
10
+ )
11
+
12
+ __all__ = (
13
+ "AiosqliteConfig",
14
+ "AiosqliteConnectTimeoutError",
15
+ "AiosqliteConnection",
16
+ "AiosqliteConnectionParams",
17
+ "AiosqliteConnectionPool",
18
+ "AiosqliteCursor",
19
+ "AiosqliteDriver",
20
+ "AiosqliteExceptionHandler",
21
+ "AiosqlitePoolClosedError",
22
+ "AiosqlitePoolConnection",
23
+ "AiosqlitePoolParams",
24
+ "default_statement_config",
25
+ )