sqlspec 0.47.0__cp314-cp314-win_amd64.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. f68e0789eb443ecb1c2c__mypyc.cp314-win_amd64.pyd +0 -0
  2. sqlspec/__init__.py +167 -0
  3. sqlspec/__main__.py +12 -0
  4. sqlspec/__metadata__.py +14 -0
  5. sqlspec/_typing.py +714 -0
  6. sqlspec/adapters/__init__.py +0 -0
  7. sqlspec/adapters/adbc/__init__.py +13 -0
  8. sqlspec/adapters/adbc/_typing.py +106 -0
  9. sqlspec/adapters/adbc/adk/__init__.py +5 -0
  10. sqlspec/adapters/adbc/adk/store.py +1280 -0
  11. sqlspec/adapters/adbc/config.py +378 -0
  12. sqlspec/adapters/adbc/core.cp314-win_amd64.pyd +0 -0
  13. sqlspec/adapters/adbc/core.py +922 -0
  14. sqlspec/adapters/adbc/data_dictionary.py +339 -0
  15. sqlspec/adapters/adbc/driver.py +534 -0
  16. sqlspec/adapters/adbc/events/__init__.py +5 -0
  17. sqlspec/adapters/adbc/events/store.py +285 -0
  18. sqlspec/adapters/adbc/litestar/__init__.py +5 -0
  19. sqlspec/adapters/adbc/litestar/store.py +534 -0
  20. sqlspec/adapters/adbc/type_converter.cp314-win_amd64.pyd +0 -0
  21. sqlspec/adapters/adbc/type_converter.py +142 -0
  22. sqlspec/adapters/aiomysql/__init__.py +21 -0
  23. sqlspec/adapters/aiomysql/_typing.py +137 -0
  24. sqlspec/adapters/aiomysql/adk/__init__.py +5 -0
  25. sqlspec/adapters/aiomysql/adk/store.py +678 -0
  26. sqlspec/adapters/aiomysql/config.py +305 -0
  27. sqlspec/adapters/aiomysql/core.cp314-win_amd64.pyd +0 -0
  28. sqlspec/adapters/aiomysql/core.py +536 -0
  29. sqlspec/adapters/aiomysql/data_dictionary.py +121 -0
  30. sqlspec/adapters/aiomysql/driver.py +386 -0
  31. sqlspec/adapters/aiomysql/events/__init__.py +5 -0
  32. sqlspec/adapters/aiomysql/events/store.py +104 -0
  33. sqlspec/adapters/aiomysql/litestar/__init__.py +5 -0
  34. sqlspec/adapters/aiomysql/litestar/store.py +314 -0
  35. sqlspec/adapters/aiosqlite/__init__.py +26 -0
  36. sqlspec/adapters/aiosqlite/_typing.py +109 -0
  37. sqlspec/adapters/aiosqlite/adk/__init__.py +5 -0
  38. sqlspec/adapters/aiosqlite/adk/store.py +829 -0
  39. sqlspec/adapters/aiosqlite/config.py +315 -0
  40. sqlspec/adapters/aiosqlite/core.cp314-win_amd64.pyd +0 -0
  41. sqlspec/adapters/aiosqlite/core.py +315 -0
  42. sqlspec/adapters/aiosqlite/data_dictionary.py +202 -0
  43. sqlspec/adapters/aiosqlite/driver.py +311 -0
  44. sqlspec/adapters/aiosqlite/events/__init__.py +5 -0
  45. sqlspec/adapters/aiosqlite/events/store.py +20 -0
  46. sqlspec/adapters/aiosqlite/litestar/__init__.py +5 -0
  47. sqlspec/adapters/aiosqlite/litestar/store.py +279 -0
  48. sqlspec/adapters/aiosqlite/pool.cp314-win_amd64.pyd +0 -0
  49. sqlspec/adapters/aiosqlite/pool.py +734 -0
  50. sqlspec/adapters/asyncmy/__init__.py +21 -0
  51. sqlspec/adapters/asyncmy/_typing.py +113 -0
  52. sqlspec/adapters/asyncmy/adk/__init__.py +5 -0
  53. sqlspec/adapters/asyncmy/adk/store.py +644 -0
  54. sqlspec/adapters/asyncmy/config.py +307 -0
  55. sqlspec/adapters/asyncmy/core.cp314-win_amd64.pyd +0 -0
  56. sqlspec/adapters/asyncmy/core.py +538 -0
  57. sqlspec/adapters/asyncmy/data_dictionary.py +122 -0
  58. sqlspec/adapters/asyncmy/driver.py +391 -0
  59. sqlspec/adapters/asyncmy/events/__init__.py +5 -0
  60. sqlspec/adapters/asyncmy/events/store.py +104 -0
  61. sqlspec/adapters/asyncmy/litestar/__init__.py +5 -0
  62. sqlspec/adapters/asyncmy/litestar/store.py +296 -0
  63. sqlspec/adapters/asyncpg/__init__.py +26 -0
  64. sqlspec/adapters/asyncpg/_typing.py +103 -0
  65. sqlspec/adapters/asyncpg/adk/__init__.py +5 -0
  66. sqlspec/adapters/asyncpg/adk/store.py +483 -0
  67. sqlspec/adapters/asyncpg/config.py +575 -0
  68. sqlspec/adapters/asyncpg/core.cp314-win_amd64.pyd +0 -0
  69. sqlspec/adapters/asyncpg/core.py +480 -0
  70. sqlspec/adapters/asyncpg/data_dictionary.py +157 -0
  71. sqlspec/adapters/asyncpg/driver.py +487 -0
  72. sqlspec/adapters/asyncpg/events/__init__.py +6 -0
  73. sqlspec/adapters/asyncpg/events/_hub.py +181 -0
  74. sqlspec/adapters/asyncpg/events/backend.py +210 -0
  75. sqlspec/adapters/asyncpg/events/store.py +40 -0
  76. sqlspec/adapters/asyncpg/litestar/__init__.py +5 -0
  77. sqlspec/adapters/asyncpg/litestar/store.py +251 -0
  78. sqlspec/adapters/bigquery/__init__.py +15 -0
  79. sqlspec/adapters/bigquery/_typing.py +108 -0
  80. sqlspec/adapters/bigquery/config.py +362 -0
  81. sqlspec/adapters/bigquery/core.cp314-win_amd64.pyd +0 -0
  82. sqlspec/adapters/bigquery/core.py +768 -0
  83. sqlspec/adapters/bigquery/data_dictionary.py +120 -0
  84. sqlspec/adapters/bigquery/driver.py +542 -0
  85. sqlspec/adapters/bigquery/events/__init__.py +5 -0
  86. sqlspec/adapters/bigquery/events/store.py +139 -0
  87. sqlspec/adapters/bigquery/litestar/__init__.py +5 -0
  88. sqlspec/adapters/bigquery/litestar/store.py +325 -0
  89. sqlspec/adapters/bigquery/type_converter.cp314-win_amd64.pyd +0 -0
  90. sqlspec/adapters/bigquery/type_converter.py +107 -0
  91. sqlspec/adapters/cockroach_asyncpg/__init__.py +26 -0
  92. sqlspec/adapters/cockroach_asyncpg/_typing.py +73 -0
  93. sqlspec/adapters/cockroach_asyncpg/adk/__init__.py +3 -0
  94. sqlspec/adapters/cockroach_asyncpg/adk/store.py +465 -0
  95. sqlspec/adapters/cockroach_asyncpg/config.py +248 -0
  96. sqlspec/adapters/cockroach_asyncpg/core.cp314-win_amd64.pyd +0 -0
  97. sqlspec/adapters/cockroach_asyncpg/core.py +55 -0
  98. sqlspec/adapters/cockroach_asyncpg/data_dictionary.py +110 -0
  99. sqlspec/adapters/cockroach_asyncpg/driver.py +142 -0
  100. sqlspec/adapters/cockroach_asyncpg/events/__init__.py +3 -0
  101. sqlspec/adapters/cockroach_asyncpg/events/store.py +20 -0
  102. sqlspec/adapters/cockroach_asyncpg/litestar/__init__.py +3 -0
  103. sqlspec/adapters/cockroach_asyncpg/litestar/store.py +142 -0
  104. sqlspec/adapters/cockroach_psycopg/__init__.py +39 -0
  105. sqlspec/adapters/cockroach_psycopg/_typing.py +137 -0
  106. sqlspec/adapters/cockroach_psycopg/adk/__init__.py +13 -0
  107. sqlspec/adapters/cockroach_psycopg/adk/store.py +1039 -0
  108. sqlspec/adapters/cockroach_psycopg/config.py +511 -0
  109. sqlspec/adapters/cockroach_psycopg/core.cp314-win_amd64.pyd +0 -0
  110. sqlspec/adapters/cockroach_psycopg/core.py +63 -0
  111. sqlspec/adapters/cockroach_psycopg/data_dictionary.py +220 -0
  112. sqlspec/adapters/cockroach_psycopg/driver.py +273 -0
  113. sqlspec/adapters/cockroach_psycopg/events/__init__.py +6 -0
  114. sqlspec/adapters/cockroach_psycopg/events/store.py +34 -0
  115. sqlspec/adapters/cockroach_psycopg/litestar/__init__.py +3 -0
  116. sqlspec/adapters/cockroach_psycopg/litestar/store.py +327 -0
  117. sqlspec/adapters/duckdb/__init__.py +29 -0
  118. sqlspec/adapters/duckdb/_typing.py +104 -0
  119. sqlspec/adapters/duckdb/adk/__init__.py +14 -0
  120. sqlspec/adapters/duckdb/adk/store.py +935 -0
  121. sqlspec/adapters/duckdb/config.py +386 -0
  122. sqlspec/adapters/duckdb/core.cp314-win_amd64.pyd +0 -0
  123. sqlspec/adapters/duckdb/core.py +332 -0
  124. sqlspec/adapters/duckdb/data_dictionary.py +140 -0
  125. sqlspec/adapters/duckdb/driver.py +426 -0
  126. sqlspec/adapters/duckdb/events/__init__.py +5 -0
  127. sqlspec/adapters/duckdb/events/store.py +57 -0
  128. sqlspec/adapters/duckdb/litestar/__init__.py +5 -0
  129. sqlspec/adapters/duckdb/litestar/store.py +330 -0
  130. sqlspec/adapters/duckdb/pool.cp314-win_amd64.pyd +0 -0
  131. sqlspec/adapters/duckdb/pool.py +350 -0
  132. sqlspec/adapters/duckdb/type_converter.cp314-win_amd64.pyd +0 -0
  133. sqlspec/adapters/duckdb/type_converter.py +118 -0
  134. sqlspec/adapters/mysqlconnector/__init__.py +39 -0
  135. sqlspec/adapters/mysqlconnector/_typing.py +186 -0
  136. sqlspec/adapters/mysqlconnector/adk/__init__.py +15 -0
  137. sqlspec/adapters/mysqlconnector/adk/store.py +1183 -0
  138. sqlspec/adapters/mysqlconnector/config.py +421 -0
  139. sqlspec/adapters/mysqlconnector/core.cp314-win_amd64.pyd +0 -0
  140. sqlspec/adapters/mysqlconnector/core.py +472 -0
  141. sqlspec/adapters/mysqlconnector/data_dictionary.py +230 -0
  142. sqlspec/adapters/mysqlconnector/driver.py +516 -0
  143. sqlspec/adapters/mysqlconnector/events/__init__.py +8 -0
  144. sqlspec/adapters/mysqlconnector/events/store.py +98 -0
  145. sqlspec/adapters/mysqlconnector/litestar/__init__.py +5 -0
  146. sqlspec/adapters/mysqlconnector/litestar/store.py +426 -0
  147. sqlspec/adapters/oracledb/__init__.py +39 -0
  148. sqlspec/adapters/oracledb/_json_handlers.cp314-win_amd64.pyd +0 -0
  149. sqlspec/adapters/oracledb/_json_handlers.py +196 -0
  150. sqlspec/adapters/oracledb/_param_types.cp314-win_amd64.pyd +0 -0
  151. sqlspec/adapters/oracledb/_param_types.py +46 -0
  152. sqlspec/adapters/oracledb/_typing.py +258 -0
  153. sqlspec/adapters/oracledb/_uuid_handlers.cp314-win_amd64.pyd +0 -0
  154. sqlspec/adapters/oracledb/_uuid_handlers.py +163 -0
  155. sqlspec/adapters/oracledb/_vector_handlers.cp314-win_amd64.pyd +0 -0
  156. sqlspec/adapters/oracledb/_vector_handlers.py +228 -0
  157. sqlspec/adapters/oracledb/adk/__init__.py +21 -0
  158. sqlspec/adapters/oracledb/adk/store.py +2453 -0
  159. sqlspec/adapters/oracledb/config.py +575 -0
  160. sqlspec/adapters/oracledb/core.cp314-win_amd64.pyd +0 -0
  161. sqlspec/adapters/oracledb/core.py +820 -0
  162. sqlspec/adapters/oracledb/data_dictionary.py +404 -0
  163. sqlspec/adapters/oracledb/driver.py +1277 -0
  164. sqlspec/adapters/oracledb/events/__init__.py +16 -0
  165. sqlspec/adapters/oracledb/events/_hub.py +345 -0
  166. sqlspec/adapters/oracledb/events/backend.py +300 -0
  167. sqlspec/adapters/oracledb/events/store.py +420 -0
  168. sqlspec/adapters/oracledb/litestar/__init__.py +5 -0
  169. sqlspec/adapters/oracledb/litestar/store.py +781 -0
  170. sqlspec/adapters/oracledb/migrations.py +539 -0
  171. sqlspec/adapters/oracledb/type_converter.cp314-win_amd64.pyd +0 -0
  172. sqlspec/adapters/oracledb/type_converter.py +211 -0
  173. sqlspec/adapters/psqlpy/__init__.py +18 -0
  174. sqlspec/adapters/psqlpy/_typing.py +121 -0
  175. sqlspec/adapters/psqlpy/adk/__init__.py +5 -0
  176. sqlspec/adapters/psqlpy/adk/store.py +591 -0
  177. sqlspec/adapters/psqlpy/config.py +376 -0
  178. sqlspec/adapters/psqlpy/core.cp314-win_amd64.pyd +0 -0
  179. sqlspec/adapters/psqlpy/core.py +694 -0
  180. sqlspec/adapters/psqlpy/data_dictionary.py +121 -0
  181. sqlspec/adapters/psqlpy/driver.py +411 -0
  182. sqlspec/adapters/psqlpy/events/__init__.py +6 -0
  183. sqlspec/adapters/psqlpy/events/_hub.py +204 -0
  184. sqlspec/adapters/psqlpy/events/backend.py +210 -0
  185. sqlspec/adapters/psqlpy/events/store.py +20 -0
  186. sqlspec/adapters/psqlpy/litestar/__init__.py +5 -0
  187. sqlspec/adapters/psqlpy/litestar/store.py +270 -0
  188. sqlspec/adapters/psqlpy/type_converter.cp314-win_amd64.pyd +0 -0
  189. sqlspec/adapters/psqlpy/type_converter.py +113 -0
  190. sqlspec/adapters/psycopg/__init__.py +38 -0
  191. sqlspec/adapters/psycopg/_typing.py +218 -0
  192. sqlspec/adapters/psycopg/adk/__init__.py +10 -0
  193. sqlspec/adapters/psycopg/adk/store.py +1106 -0
  194. sqlspec/adapters/psycopg/config.py +695 -0
  195. sqlspec/adapters/psycopg/core.cp314-win_amd64.pyd +0 -0
  196. sqlspec/adapters/psycopg/core.py +520 -0
  197. sqlspec/adapters/psycopg/data_dictionary.py +278 -0
  198. sqlspec/adapters/psycopg/driver.py +1033 -0
  199. sqlspec/adapters/psycopg/events/__init__.py +20 -0
  200. sqlspec/adapters/psycopg/events/_hub.py +388 -0
  201. sqlspec/adapters/psycopg/events/backend.py +398 -0
  202. sqlspec/adapters/psycopg/events/store.py +42 -0
  203. sqlspec/adapters/psycopg/litestar/__init__.py +5 -0
  204. sqlspec/adapters/psycopg/litestar/store.py +554 -0
  205. sqlspec/adapters/psycopg/type_converter.cp314-win_amd64.pyd +0 -0
  206. sqlspec/adapters/psycopg/type_converter.py +93 -0
  207. sqlspec/adapters/pymysql/__init__.py +21 -0
  208. sqlspec/adapters/pymysql/_typing.py +92 -0
  209. sqlspec/adapters/pymysql/adk/__init__.py +5 -0
  210. sqlspec/adapters/pymysql/adk/store.py +657 -0
  211. sqlspec/adapters/pymysql/config.py +176 -0
  212. sqlspec/adapters/pymysql/core.cp314-win_amd64.pyd +0 -0
  213. sqlspec/adapters/pymysql/core.py +469 -0
  214. sqlspec/adapters/pymysql/data_dictionary.py +120 -0
  215. sqlspec/adapters/pymysql/driver.py +271 -0
  216. sqlspec/adapters/pymysql/events/__init__.py +5 -0
  217. sqlspec/adapters/pymysql/events/store.py +50 -0
  218. sqlspec/adapters/pymysql/litestar/__init__.py +5 -0
  219. sqlspec/adapters/pymysql/litestar/store.py +232 -0
  220. sqlspec/adapters/pymysql/pool.cp314-win_amd64.pyd +0 -0
  221. sqlspec/adapters/pymysql/pool.py +184 -0
  222. sqlspec/adapters/spanner/__init__.py +33 -0
  223. sqlspec/adapters/spanner/_typing.py +102 -0
  224. sqlspec/adapters/spanner/adk/__init__.py +5 -0
  225. sqlspec/adapters/spanner/adk/store.py +758 -0
  226. sqlspec/adapters/spanner/config.py +355 -0
  227. sqlspec/adapters/spanner/core.cp314-win_amd64.pyd +0 -0
  228. sqlspec/adapters/spanner/core.py +263 -0
  229. sqlspec/adapters/spanner/data_dictionary.py +120 -0
  230. sqlspec/adapters/spanner/driver.py +407 -0
  231. sqlspec/adapters/spanner/events/__init__.py +5 -0
  232. sqlspec/adapters/spanner/events/store.py +187 -0
  233. sqlspec/adapters/spanner/litestar/__init__.py +5 -0
  234. sqlspec/adapters/spanner/litestar/store.py +291 -0
  235. sqlspec/adapters/spanner/type_converter.cp314-win_amd64.pyd +0 -0
  236. sqlspec/adapters/spanner/type_converter.py +342 -0
  237. sqlspec/adapters/sqlite/__init__.py +19 -0
  238. sqlspec/adapters/sqlite/_typing.py +123 -0
  239. sqlspec/adapters/sqlite/adk/__init__.py +5 -0
  240. sqlspec/adapters/sqlite/adk/store.py +992 -0
  241. sqlspec/adapters/sqlite/config.py +240 -0
  242. sqlspec/adapters/sqlite/core.cp314-win_amd64.pyd +0 -0
  243. sqlspec/adapters/sqlite/core.py +357 -0
  244. sqlspec/adapters/sqlite/data_dictionary.py +198 -0
  245. sqlspec/adapters/sqlite/driver.py +527 -0
  246. sqlspec/adapters/sqlite/events/__init__.py +5 -0
  247. sqlspec/adapters/sqlite/events/store.py +20 -0
  248. sqlspec/adapters/sqlite/litestar/__init__.py +5 -0
  249. sqlspec/adapters/sqlite/litestar/store.py +316 -0
  250. sqlspec/adapters/sqlite/pool.cp314-win_amd64.pyd +0 -0
  251. sqlspec/adapters/sqlite/pool.py +237 -0
  252. sqlspec/adapters/sqlite/type_converter.cp314-win_amd64.pyd +0 -0
  253. sqlspec/adapters/sqlite/type_converter.py +114 -0
  254. sqlspec/base.py +832 -0
  255. sqlspec/builder/__init__.py +181 -0
  256. sqlspec/builder/_base.cp314-win_amd64.pyd +0 -0
  257. sqlspec/builder/_base.py +1071 -0
  258. sqlspec/builder/_column.cp314-win_amd64.pyd +0 -0
  259. sqlspec/builder/_column.py +521 -0
  260. sqlspec/builder/_ddl.cp314-win_amd64.pyd +0 -0
  261. sqlspec/builder/_ddl.py +1691 -0
  262. sqlspec/builder/_delete.cp314-win_amd64.pyd +0 -0
  263. sqlspec/builder/_delete.py +95 -0
  264. sqlspec/builder/_dml.cp314-win_amd64.pyd +0 -0
  265. sqlspec/builder/_dml.py +386 -0
  266. sqlspec/builder/_explain.cp314-win_amd64.pyd +0 -0
  267. sqlspec/builder/_explain.py +579 -0
  268. sqlspec/builder/_expression_wrappers.cp314-win_amd64.pyd +0 -0
  269. sqlspec/builder/_expression_wrappers.py +46 -0
  270. sqlspec/builder/_factory.cp314-win_amd64.pyd +0 -0
  271. sqlspec/builder/_factory.py +1884 -0
  272. sqlspec/builder/_insert.cp314-win_amd64.pyd +0 -0
  273. sqlspec/builder/_insert.py +405 -0
  274. sqlspec/builder/_join.cp314-win_amd64.pyd +0 -0
  275. sqlspec/builder/_join.py +489 -0
  276. sqlspec/builder/_merge.cp314-win_amd64.pyd +0 -0
  277. sqlspec/builder/_merge.py +823 -0
  278. sqlspec/builder/_parsing_utils.cp314-win_amd64.pyd +0 -0
  279. sqlspec/builder/_parsing_utils.py +295 -0
  280. sqlspec/builder/_select.cp314-win_amd64.pyd +0 -0
  281. sqlspec/builder/_select.py +1666 -0
  282. sqlspec/builder/_temporal.cp314-win_amd64.pyd +0 -0
  283. sqlspec/builder/_temporal.py +167 -0
  284. sqlspec/builder/_update.cp314-win_amd64.pyd +0 -0
  285. sqlspec/builder/_update.py +173 -0
  286. sqlspec/builder/_vector_distance.cp314-win_amd64.pyd +0 -0
  287. sqlspec/builder/_vector_distance.py +330 -0
  288. sqlspec/cli.py +1095 -0
  289. sqlspec/config.py +2383 -0
  290. sqlspec/core/__init__.py +372 -0
  291. sqlspec/core/_correlation.cp314-win_amd64.pyd +0 -0
  292. sqlspec/core/_correlation.py +176 -0
  293. sqlspec/core/_pagination.py +42 -0
  294. sqlspec/core/_pool.cp314-win_amd64.pyd +0 -0
  295. sqlspec/core/_pool.py +76 -0
  296. sqlspec/core/cache.cp314-win_amd64.pyd +0 -0
  297. sqlspec/core/cache.py +1085 -0
  298. sqlspec/core/compiler.cp314-win_amd64.pyd +0 -0
  299. sqlspec/core/compiler.py +1090 -0
  300. sqlspec/core/config_runtime.cp314-win_amd64.pyd +0 -0
  301. sqlspec/core/config_runtime.py +174 -0
  302. sqlspec/core/explain.cp314-win_amd64.pyd +0 -0
  303. sqlspec/core/explain.py +275 -0
  304. sqlspec/core/filters.cp314-win_amd64.pyd +0 -0
  305. sqlspec/core/filters.py +969 -0
  306. sqlspec/core/hashing.cp314-win_amd64.pyd +0 -0
  307. sqlspec/core/hashing.py +266 -0
  308. sqlspec/core/metrics.cp314-win_amd64.pyd +0 -0
  309. sqlspec/core/metrics.py +83 -0
  310. sqlspec/core/parameters/__init__.py +72 -0
  311. sqlspec/core/parameters/_alignment.cp314-win_amd64.pyd +0 -0
  312. sqlspec/core/parameters/_alignment.py +283 -0
  313. sqlspec/core/parameters/_converter.cp314-win_amd64.pyd +0 -0
  314. sqlspec/core/parameters/_converter.py +554 -0
  315. sqlspec/core/parameters/_processor.cp314-win_amd64.pyd +0 -0
  316. sqlspec/core/parameters/_processor.py +1182 -0
  317. sqlspec/core/parameters/_registry.cp314-win_amd64.pyd +0 -0
  318. sqlspec/core/parameters/_registry.py +206 -0
  319. sqlspec/core/parameters/_transformers.cp314-win_amd64.pyd +0 -0
  320. sqlspec/core/parameters/_transformers.py +324 -0
  321. sqlspec/core/parameters/_types.cp314-win_amd64.pyd +0 -0
  322. sqlspec/core/parameters/_types.py +536 -0
  323. sqlspec/core/parameters/_validator.cp314-win_amd64.pyd +0 -0
  324. sqlspec/core/parameters/_validator.py +171 -0
  325. sqlspec/core/pipeline.cp314-win_amd64.pyd +0 -0
  326. sqlspec/core/pipeline.py +333 -0
  327. sqlspec/core/query_modifiers.cp314-win_amd64.pyd +0 -0
  328. sqlspec/core/query_modifiers.py +508 -0
  329. sqlspec/core/result/__init__.py +25 -0
  330. sqlspec/core/result/_base.cp314-win_amd64.pyd +0 -0
  331. sqlspec/core/result/_base.py +1232 -0
  332. sqlspec/core/result/_io.cp314-win_amd64.pyd +0 -0
  333. sqlspec/core/result/_io.py +28 -0
  334. sqlspec/core/splitter.cp314-win_amd64.pyd +0 -0
  335. sqlspec/core/splitter.py +1021 -0
  336. sqlspec/core/sqlcommenter.cp314-win_amd64.pyd +0 -0
  337. sqlspec/core/sqlcommenter.py +249 -0
  338. sqlspec/core/stack.cp314-win_amd64.pyd +0 -0
  339. sqlspec/core/stack.py +163 -0
  340. sqlspec/core/statement.cp314-win_amd64.pyd +0 -0
  341. sqlspec/core/statement.py +1865 -0
  342. sqlspec/core/type_converter.cp314-win_amd64.pyd +0 -0
  343. sqlspec/core/type_converter.py +340 -0
  344. sqlspec/data_dictionary/__init__.py +22 -0
  345. sqlspec/data_dictionary/_loader.cp314-win_amd64.pyd +0 -0
  346. sqlspec/data_dictionary/_loader.py +138 -0
  347. sqlspec/data_dictionary/_registry.cp314-win_amd64.pyd +0 -0
  348. sqlspec/data_dictionary/_registry.py +74 -0
  349. sqlspec/data_dictionary/_types.cp314-win_amd64.pyd +0 -0
  350. sqlspec/data_dictionary/_types.py +121 -0
  351. sqlspec/data_dictionary/dialects/__init__.py +21 -0
  352. sqlspec/data_dictionary/dialects/bigquery.cp314-win_amd64.pyd +0 -0
  353. sqlspec/data_dictionary/dialects/bigquery.py +81 -0
  354. sqlspec/data_dictionary/dialects/cockroachdb.cp314-win_amd64.pyd +0 -0
  355. sqlspec/data_dictionary/dialects/cockroachdb.py +54 -0
  356. sqlspec/data_dictionary/dialects/duckdb.cp314-win_amd64.pyd +0 -0
  357. sqlspec/data_dictionary/dialects/duckdb.py +47 -0
  358. sqlspec/data_dictionary/dialects/mysql.cp314-win_amd64.pyd +0 -0
  359. sqlspec/data_dictionary/dialects/mysql.py +53 -0
  360. sqlspec/data_dictionary/dialects/oracle.cp314-win_amd64.pyd +0 -0
  361. sqlspec/data_dictionary/dialects/oracle.py +197 -0
  362. sqlspec/data_dictionary/dialects/postgres.cp314-win_amd64.pyd +0 -0
  363. sqlspec/data_dictionary/dialects/postgres.py +69 -0
  364. sqlspec/data_dictionary/dialects/spanner.cp314-win_amd64.pyd +0 -0
  365. sqlspec/data_dictionary/dialects/spanner.py +37 -0
  366. sqlspec/data_dictionary/dialects/sqlite.cp314-win_amd64.pyd +0 -0
  367. sqlspec/data_dictionary/dialects/sqlite.py +59 -0
  368. sqlspec/data_dictionary/sql/.gitkeep +0 -0
  369. sqlspec/data_dictionary/sql/bigquery/columns.sql +23 -0
  370. sqlspec/data_dictionary/sql/bigquery/foreign_keys.sql +34 -0
  371. sqlspec/data_dictionary/sql/bigquery/indexes.sql +19 -0
  372. sqlspec/data_dictionary/sql/bigquery/tables.sql +33 -0
  373. sqlspec/data_dictionary/sql/bigquery/version.sql +3 -0
  374. sqlspec/data_dictionary/sql/cockroachdb/columns.sql +34 -0
  375. sqlspec/data_dictionary/sql/cockroachdb/foreign_keys.sql +40 -0
  376. sqlspec/data_dictionary/sql/cockroachdb/indexes.sql +32 -0
  377. sqlspec/data_dictionary/sql/cockroachdb/tables.sql +44 -0
  378. sqlspec/data_dictionary/sql/cockroachdb/version.sql +3 -0
  379. sqlspec/data_dictionary/sql/duckdb/columns.sql +23 -0
  380. sqlspec/data_dictionary/sql/duckdb/foreign_keys.sql +36 -0
  381. sqlspec/data_dictionary/sql/duckdb/indexes.sql +19 -0
  382. sqlspec/data_dictionary/sql/duckdb/tables.sql +38 -0
  383. sqlspec/data_dictionary/sql/duckdb/version.sql +3 -0
  384. sqlspec/data_dictionary/sql/mysql/columns.sql +23 -0
  385. sqlspec/data_dictionary/sql/mysql/foreign_keys.sql +28 -0
  386. sqlspec/data_dictionary/sql/mysql/indexes.sql +26 -0
  387. sqlspec/data_dictionary/sql/mysql/tables.sql +33 -0
  388. sqlspec/data_dictionary/sql/mysql/version.sql +3 -0
  389. sqlspec/data_dictionary/sql/oracle/columns.sql +23 -0
  390. sqlspec/data_dictionary/sql/oracle/foreign_keys.sql +48 -0
  391. sqlspec/data_dictionary/sql/oracle/indexes.sql +44 -0
  392. sqlspec/data_dictionary/sql/oracle/tables.sql +25 -0
  393. sqlspec/data_dictionary/sql/oracle/version.sql +20 -0
  394. sqlspec/data_dictionary/sql/postgres/columns.sql +34 -0
  395. sqlspec/data_dictionary/sql/postgres/foreign_keys.sql +40 -0
  396. sqlspec/data_dictionary/sql/postgres/indexes.sql +56 -0
  397. sqlspec/data_dictionary/sql/postgres/tables.sql +44 -0
  398. sqlspec/data_dictionary/sql/postgres/version.sql +3 -0
  399. sqlspec/data_dictionary/sql/spanner/columns.sql +23 -0
  400. sqlspec/data_dictionary/sql/spanner/foreign_keys.sql +70 -0
  401. sqlspec/data_dictionary/sql/spanner/indexes.sql +30 -0
  402. sqlspec/data_dictionary/sql/spanner/tables.sql +9 -0
  403. sqlspec/data_dictionary/sql/spanner/version.sql +3 -0
  404. sqlspec/data_dictionary/sql/sqlite/columns.sql +23 -0
  405. sqlspec/data_dictionary/sql/sqlite/foreign_keys.sql +22 -0
  406. sqlspec/data_dictionary/sql/sqlite/indexes.sql +7 -0
  407. sqlspec/data_dictionary/sql/sqlite/tables.sql +28 -0
  408. sqlspec/data_dictionary/sql/sqlite/version.sql +3 -0
  409. sqlspec/dialects/__init__.py +22 -0
  410. sqlspec/dialects/_compat.cp314-win_amd64.pyd +0 -0
  411. sqlspec/dialects/_compat.py +14 -0
  412. sqlspec/dialects/postgres/__init__.py +9 -0
  413. sqlspec/dialects/postgres/_generators.cp314-win_amd64.pyd +0 -0
  414. sqlspec/dialects/postgres/_generators.py +57 -0
  415. sqlspec/dialects/postgres/_operators.cp314-win_amd64.pyd +0 -0
  416. sqlspec/dialects/postgres/_operators.py +81 -0
  417. sqlspec/dialects/postgres/_paradedb.py +50 -0
  418. sqlspec/dialects/postgres/_pgvector.py +36 -0
  419. sqlspec/dialects/spanner/__init__.py +6 -0
  420. sqlspec/dialects/spanner/_generators.cp314-win_amd64.pyd +0 -0
  421. sqlspec/dialects/spanner/_generators.py +206 -0
  422. sqlspec/dialects/spanner/_spangres.py +77 -0
  423. sqlspec/dialects/spanner/_spanner.py +179 -0
  424. sqlspec/driver/__init__.py +49 -0
  425. sqlspec/driver/_async.cp314-win_amd64.pyd +0 -0
  426. sqlspec/driver/_async.py +1830 -0
  427. sqlspec/driver/_common.cp314-win_amd64.pyd +0 -0
  428. sqlspec/driver/_common.py +2292 -0
  429. sqlspec/driver/_exception_handler.cp314-win_amd64.pyd +0 -0
  430. sqlspec/driver/_exception_handler.py +108 -0
  431. sqlspec/driver/_query_cache.cp314-win_amd64.pyd +0 -0
  432. sqlspec/driver/_query_cache.py +96 -0
  433. sqlspec/driver/_sql_helpers.cp314-win_amd64.pyd +0 -0
  434. sqlspec/driver/_sql_helpers.py +139 -0
  435. sqlspec/driver/_storage_helpers.cp314-win_amd64.pyd +0 -0
  436. sqlspec/driver/_storage_helpers.py +153 -0
  437. sqlspec/driver/_sync.cp314-win_amd64.pyd +0 -0
  438. sqlspec/driver/_sync.py +1817 -0
  439. sqlspec/exceptions.cp314-win_amd64.pyd +0 -0
  440. sqlspec/exceptions.py +480 -0
  441. sqlspec/extensions/__init__.py +0 -0
  442. sqlspec/extensions/adk/__init__.py +84 -0
  443. sqlspec/extensions/adk/_config_utils.py +199 -0
  444. sqlspec/extensions/adk/_types.cp314-win_amd64.pyd +0 -0
  445. sqlspec/extensions/adk/_types.py +41 -0
  446. sqlspec/extensions/adk/artifact/__init__.py +57 -0
  447. sqlspec/extensions/adk/artifact/_types.cp314-win_amd64.pyd +0 -0
  448. sqlspec/extensions/adk/artifact/_types.py +32 -0
  449. sqlspec/extensions/adk/artifact/service.py +508 -0
  450. sqlspec/extensions/adk/artifact/store.py +361 -0
  451. sqlspec/extensions/adk/converters.py +212 -0
  452. sqlspec/extensions/adk/memory/__init__.py +69 -0
  453. sqlspec/extensions/adk/memory/_types.cp314-win_amd64.pyd +0 -0
  454. sqlspec/extensions/adk/memory/_types.py +30 -0
  455. sqlspec/extensions/adk/memory/converters.py +225 -0
  456. sqlspec/extensions/adk/memory/service.py +316 -0
  457. sqlspec/extensions/adk/memory/store.py +525 -0
  458. sqlspec/extensions/adk/migrations/0001_create_adk_tables.py +184 -0
  459. sqlspec/extensions/adk/migrations/__init__.py +0 -0
  460. sqlspec/extensions/adk/service.py +279 -0
  461. sqlspec/extensions/adk/store.py +590 -0
  462. sqlspec/extensions/events/__init__.py +51 -0
  463. sqlspec/extensions/events/_channel.py +703 -0
  464. sqlspec/extensions/events/_hints.cp314-win_amd64.pyd +0 -0
  465. sqlspec/extensions/events/_hints.py +45 -0
  466. sqlspec/extensions/events/_models.py +23 -0
  467. sqlspec/extensions/events/_payload.cp314-win_amd64.pyd +0 -0
  468. sqlspec/extensions/events/_payload.py +69 -0
  469. sqlspec/extensions/events/_protocols.py +134 -0
  470. sqlspec/extensions/events/_queue.py +462 -0
  471. sqlspec/extensions/events/_store.py +209 -0
  472. sqlspec/extensions/events/migrations/0001_create_event_queue.py +59 -0
  473. sqlspec/extensions/events/migrations/__init__.py +3 -0
  474. sqlspec/extensions/fastapi/__init__.py +22 -0
  475. sqlspec/extensions/fastapi/extension.py +391 -0
  476. sqlspec/extensions/fastapi/providers.cp314-win_amd64.pyd +0 -0
  477. sqlspec/extensions/fastapi/providers.py +712 -0
  478. sqlspec/extensions/flask/__init__.py +38 -0
  479. sqlspec/extensions/flask/_state.py +87 -0
  480. sqlspec/extensions/flask/_utils.py +71 -0
  481. sqlspec/extensions/flask/extension.py +539 -0
  482. sqlspec/extensions/litestar/__init__.py +31 -0
  483. sqlspec/extensions/litestar/_utils.py +52 -0
  484. sqlspec/extensions/litestar/channels.py +165 -0
  485. sqlspec/extensions/litestar/cli.py +102 -0
  486. sqlspec/extensions/litestar/config.py +90 -0
  487. sqlspec/extensions/litestar/handlers.py +316 -0
  488. sqlspec/extensions/litestar/migrations/0001_create_session_table.py +137 -0
  489. sqlspec/extensions/litestar/migrations/__init__.py +3 -0
  490. sqlspec/extensions/litestar/plugin.py +1066 -0
  491. sqlspec/extensions/litestar/providers.cp314-win_amd64.pyd +0 -0
  492. sqlspec/extensions/litestar/providers.py +784 -0
  493. sqlspec/extensions/litestar/store.py +298 -0
  494. sqlspec/extensions/otel/__init__.py +58 -0
  495. sqlspec/extensions/prometheus/__init__.py +113 -0
  496. sqlspec/extensions/sanic/__init__.py +19 -0
  497. sqlspec/extensions/sanic/_state.py +43 -0
  498. sqlspec/extensions/sanic/_utils.py +127 -0
  499. sqlspec/extensions/sanic/extension.py +647 -0
  500. sqlspec/extensions/starlette/__init__.py +22 -0
  501. sqlspec/extensions/starlette/_state.py +42 -0
  502. sqlspec/extensions/starlette/_utils.py +96 -0
  503. sqlspec/extensions/starlette/extension.py +374 -0
  504. sqlspec/extensions/starlette/middleware.py +281 -0
  505. sqlspec/loader.cp314-win_amd64.pyd +0 -0
  506. sqlspec/loader.py +727 -0
  507. sqlspec/migrations/__init__.py +39 -0
  508. sqlspec/migrations/base.cp314-win_amd64.pyd +0 -0
  509. sqlspec/migrations/base.py +862 -0
  510. sqlspec/migrations/commands.py +2151 -0
  511. sqlspec/migrations/context.cp314-win_amd64.pyd +0 -0
  512. sqlspec/migrations/context.py +157 -0
  513. sqlspec/migrations/fix.cp314-win_amd64.pyd +0 -0
  514. sqlspec/migrations/fix.py +204 -0
  515. sqlspec/migrations/loaders.cp314-win_amd64.pyd +0 -0
  516. sqlspec/migrations/loaders.py +443 -0
  517. sqlspec/migrations/runner.cp314-win_amd64.pyd +0 -0
  518. sqlspec/migrations/runner.py +1195 -0
  519. sqlspec/migrations/squash.cp314-win_amd64.pyd +0 -0
  520. sqlspec/migrations/squash.py +490 -0
  521. sqlspec/migrations/templates.cp314-win_amd64.pyd +0 -0
  522. sqlspec/migrations/templates.py +234 -0
  523. sqlspec/migrations/tracker.cp314-win_amd64.pyd +0 -0
  524. sqlspec/migrations/tracker.py +792 -0
  525. sqlspec/migrations/utils.cp314-win_amd64.pyd +0 -0
  526. sqlspec/migrations/utils.py +256 -0
  527. sqlspec/migrations/validation.cp314-win_amd64.pyd +0 -0
  528. sqlspec/migrations/validation.py +359 -0
  529. sqlspec/migrations/version.cp314-win_amd64.pyd +0 -0
  530. sqlspec/migrations/version.py +446 -0
  531. sqlspec/observability/__init__.py +57 -0
  532. sqlspec/observability/_common.cp314-win_amd64.pyd +0 -0
  533. sqlspec/observability/_common.py +77 -0
  534. sqlspec/observability/_config.cp314-win_amd64.pyd +0 -0
  535. sqlspec/observability/_config.py +364 -0
  536. sqlspec/observability/_diagnostics.cp314-win_amd64.pyd +0 -0
  537. sqlspec/observability/_diagnostics.py +74 -0
  538. sqlspec/observability/_dispatcher.cp314-win_amd64.pyd +0 -0
  539. sqlspec/observability/_dispatcher.py +200 -0
  540. sqlspec/observability/_formatters/__init__.py +13 -0
  541. sqlspec/observability/_formatters/_aws.cp314-win_amd64.pyd +0 -0
  542. sqlspec/observability/_formatters/_aws.py +102 -0
  543. sqlspec/observability/_formatters/_azure.cp314-win_amd64.pyd +0 -0
  544. sqlspec/observability/_formatters/_azure.py +96 -0
  545. sqlspec/observability/_formatters/_base.cp314-win_amd64.pyd +0 -0
  546. sqlspec/observability/_formatters/_base.py +57 -0
  547. sqlspec/observability/_formatters/_gcp.cp314-win_amd64.pyd +0 -0
  548. sqlspec/observability/_formatters/_gcp.py +131 -0
  549. sqlspec/observability/_formatting.py +58 -0
  550. sqlspec/observability/_observer.cp314-win_amd64.pyd +0 -0
  551. sqlspec/observability/_observer.py +361 -0
  552. sqlspec/observability/_runtime.cp314-win_amd64.pyd +0 -0
  553. sqlspec/observability/_runtime.py +461 -0
  554. sqlspec/observability/_sampling.cp314-win_amd64.pyd +0 -0
  555. sqlspec/observability/_sampling.py +188 -0
  556. sqlspec/observability/_spans.cp314-win_amd64.pyd +0 -0
  557. sqlspec/observability/_spans.py +161 -0
  558. sqlspec/protocols.py +955 -0
  559. sqlspec/py.typed +0 -0
  560. sqlspec/service.py +433 -0
  561. sqlspec/storage/__init__.py +48 -0
  562. sqlspec/storage/_arrow_payload.py +68 -0
  563. sqlspec/storage/_paths.cp314-win_amd64.pyd +0 -0
  564. sqlspec/storage/_paths.py +58 -0
  565. sqlspec/storage/_utils.py +46 -0
  566. sqlspec/storage/backends/__init__.py +1 -0
  567. sqlspec/storage/backends/base.cp314-win_amd64.pyd +0 -0
  568. sqlspec/storage/backends/base.py +374 -0
  569. sqlspec/storage/backends/fsspec.py +574 -0
  570. sqlspec/storage/backends/local.py +468 -0
  571. sqlspec/storage/backends/obstore.py +956 -0
  572. sqlspec/storage/errors.cp314-win_amd64.pyd +0 -0
  573. sqlspec/storage/errors.py +102 -0
  574. sqlspec/storage/pipeline.cp314-win_amd64.pyd +0 -0
  575. sqlspec/storage/pipeline.py +628 -0
  576. sqlspec/storage/registry.cp314-win_amd64.pyd +0 -0
  577. sqlspec/storage/registry.py +329 -0
  578. sqlspec/typing.py +405 -0
  579. sqlspec/utils/__init__.py +7 -0
  580. sqlspec/utils/arrow_helpers.py +384 -0
  581. sqlspec/utils/config_tools.cp314-win_amd64.pyd +0 -0
  582. sqlspec/utils/config_tools.py +314 -0
  583. sqlspec/utils/correlation.cp314-win_amd64.pyd +0 -0
  584. sqlspec/utils/correlation.py +134 -0
  585. sqlspec/utils/deprecation.cp314-win_amd64.pyd +0 -0
  586. sqlspec/utils/deprecation.py +157 -0
  587. sqlspec/utils/dispatch.cp314-win_amd64.pyd +0 -0
  588. sqlspec/utils/dispatch.py +101 -0
  589. sqlspec/utils/fixtures.cp314-win_amd64.pyd +0 -0
  590. sqlspec/utils/fixtures.py +260 -0
  591. sqlspec/utils/logging.cp314-win_amd64.pyd +0 -0
  592. sqlspec/utils/logging.py +251 -0
  593. sqlspec/utils/module_loader.py +306 -0
  594. sqlspec/utils/portal.cp314-win_amd64.pyd +0 -0
  595. sqlspec/utils/portal.py +377 -0
  596. sqlspec/utils/schema.cp314-win_amd64.pyd +0 -0
  597. sqlspec/utils/schema.py +1040 -0
  598. sqlspec/utils/serializers/__init__.py +30 -0
  599. sqlspec/utils/serializers/_json.cp314-win_amd64.pyd +0 -0
  600. sqlspec/utils/serializers/_json.py +415 -0
  601. sqlspec/utils/serializers/_numpy.cp314-win_amd64.pyd +0 -0
  602. sqlspec/utils/serializers/_numpy.py +65 -0
  603. sqlspec/utils/serializers/_schema.cp314-win_amd64.pyd +0 -0
  604. sqlspec/utils/serializers/_schema.py +285 -0
  605. sqlspec/utils/singleton.cp314-win_amd64.pyd +0 -0
  606. sqlspec/utils/singleton.py +41 -0
  607. sqlspec/utils/sync_tools.cp314-win_amd64.pyd +0 -0
  608. sqlspec/utils/sync_tools.py +316 -0
  609. sqlspec/utils/text.cp314-win_amd64.pyd +0 -0
  610. sqlspec/utils/text.py +109 -0
  611. sqlspec/utils/type_converters.cp314-win_amd64.pyd +0 -0
  612. sqlspec/utils/type_converters.py +216 -0
  613. sqlspec/utils/type_guards.cp314-win_amd64.pyd +0 -0
  614. sqlspec/utils/type_guards.py +1508 -0
  615. sqlspec/utils/uuids.cp314-win_amd64.pyd +0 -0
  616. sqlspec/utils/uuids.py +241 -0
  617. sqlspec-0.47.0.dist-info/METADATA +202 -0
  618. sqlspec-0.47.0.dist-info/RECORD +621 -0
  619. sqlspec-0.47.0.dist-info/WHEEL +4 -0
  620. sqlspec-0.47.0.dist-info/entry_points.txt +6 -0
  621. sqlspec-0.47.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,210 @@
1
+ # pyright: reportPrivateUsage=false
2
+ """Native and hybrid PostgreSQL backends for EventChannel."""
3
+
4
+ import logging
5
+ from datetime import datetime, timezone
6
+ from typing import TYPE_CHECKING, Any, cast
7
+
8
+ from sqlspec.adapters.asyncpg.events._hub import AsyncpgListenerHub
9
+ from sqlspec.core import SQL
10
+ from sqlspec.exceptions import ImproperConfigurationError
11
+ from sqlspec.extensions.events import (
12
+ AsyncTableEventQueue,
13
+ EventMessage,
14
+ build_queue_backend,
15
+ decode_notify_payload,
16
+ encode_notify_payload,
17
+ )
18
+ from sqlspec.utils.logging import get_logger, log_with_context
19
+ from sqlspec.utils.serializers import from_json, to_json
20
+ from sqlspec.utils.uuids import uuid4
21
+
22
+ if TYPE_CHECKING:
23
+ from sqlspec.adapters.asyncpg.config import AsyncpgConfig
24
+
25
+ logger = get_logger("sqlspec.events.postgres")
26
+
27
+ __all__ = ("AsyncpgEventsBackend", "AsyncpgHybridEventsBackend", "create_event_backend")
28
+
29
+
30
+ def _extract_event_id(payload: "str | None") -> "str | None":
31
+ if not payload:
32
+ return None
33
+ raw = from_json(payload)
34
+ if isinstance(raw, dict):
35
+ event_id = raw.get("event_id")
36
+ return event_id if isinstance(event_id, str) else None
37
+ return None
38
+
39
+
40
+ class AsyncpgHybridEventsBackend:
41
+ """Hybrid backend combining durable queue with LISTEN/NOTIFY wakeups."""
42
+
43
+ __slots__ = ("_config", "_hub", "_queue", "_runtime")
44
+
45
+ supports_sync = False
46
+ supports_async = True
47
+ backend_name = "listen_notify_durable"
48
+
49
+ def __init__(self, config: "AsyncpgConfig", queue: "AsyncTableEventQueue") -> None:
50
+ if not config.is_async:
51
+ msg = "Asyncpg hybrid backend requires an async adapter"
52
+ raise ImproperConfigurationError(msg)
53
+ self._config = config
54
+ self._runtime = config.get_observability_runtime()
55
+ self._queue = queue
56
+ self._hub: AsyncpgListenerHub | None = None
57
+ log_with_context(
58
+ logger,
59
+ logging.DEBUG,
60
+ "event.listen",
61
+ adapter_name="asyncpg",
62
+ backend_name=self.backend_name,
63
+ mode="async",
64
+ status="backend_ready",
65
+ )
66
+
67
+ async def publish(self, channel: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None" = None) -> str:
68
+ event_id = uuid4().hex
69
+ await self._publish_durable(channel, event_id, payload, metadata)
70
+ self._runtime.increment_metric("events.publish.native")
71
+ return event_id
72
+
73
+ async def dequeue(self, channel: str, poll_interval: float) -> EventMessage | None:
74
+ hub = self._ensure_hub()
75
+ payload = await hub.dequeue(channel, poll_interval)
76
+ if payload is None:
77
+ return await self._queue.dequeue(channel)
78
+ event_id = _extract_event_id(payload)
79
+ if event_id is not None:
80
+ event = await self._queue.dequeue_by_event_id(event_id)
81
+ if event is not None:
82
+ return event
83
+ return await self._queue.dequeue(channel)
84
+
85
+ async def ack(self, event_id: str) -> None:
86
+ await self._queue.ack(event_id)
87
+ self._runtime.increment_metric("events.ack")
88
+
89
+ async def nack(self, event_id: str) -> None:
90
+ await self._queue.nack(event_id)
91
+ self._runtime.increment_metric("events.nack")
92
+
93
+ async def shutdown(self) -> None:
94
+ hub = self._hub
95
+ if hub is not None:
96
+ self._hub = None
97
+ await hub.shutdown()
98
+
99
+ def _ensure_hub(self) -> AsyncpgListenerHub:
100
+ if self._hub is None:
101
+ self._hub = AsyncpgListenerHub(self._config)
102
+ return self._hub
103
+
104
+ async def _publish_durable(
105
+ self, channel: str, event_id: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None"
106
+ ) -> None:
107
+ now = datetime.now(timezone.utc)
108
+ async with self._config.provide_session() as driver:
109
+ await driver.execute(
110
+ SQL(
111
+ self._queue._upsert_sql,
112
+ {
113
+ "event_id": event_id,
114
+ "channel": channel,
115
+ "payload_json": to_json(payload),
116
+ "metadata_json": to_json(metadata) if metadata else None,
117
+ "status": "pending",
118
+ "available_at": now,
119
+ "lease_expires_at": None,
120
+ "attempts": 0,
121
+ "created_at": now,
122
+ },
123
+ statement_config=self._queue._statement_config,
124
+ )
125
+ )
126
+ await driver.execute(SQL("SELECT pg_notify($1, $2)", channel, to_json({"event_id": event_id})))
127
+ await driver.commit()
128
+
129
+
130
+ class AsyncpgEventsBackend:
131
+ """Native LISTEN/NOTIFY backend backed by a persistent listener hub."""
132
+
133
+ __slots__ = ("_config", "_hub", "_runtime")
134
+
135
+ supports_sync = False
136
+ supports_async = True
137
+ backend_name = "listen_notify"
138
+
139
+ def __init__(self, config: "AsyncpgConfig") -> None:
140
+ if not config.is_async:
141
+ msg = "AsyncpgEventsBackend requires an async adapter"
142
+ raise ImproperConfigurationError(msg)
143
+ self._config = config
144
+ self._runtime = config.get_observability_runtime()
145
+ self._hub: AsyncpgListenerHub | None = None
146
+ log_with_context(
147
+ logger,
148
+ logging.DEBUG,
149
+ "event.listen",
150
+ adapter_name="asyncpg",
151
+ backend_name=self.backend_name,
152
+ mode="async",
153
+ status="backend_ready",
154
+ )
155
+
156
+ async def publish(self, channel: str, payload: "dict[str, Any]", metadata: "dict[str, Any] | None" = None) -> str:
157
+ event_id = uuid4().hex
158
+ async with self._config.provide_session() as driver:
159
+ await driver.execute(
160
+ SQL("SELECT pg_notify($1, $2)", channel, encode_notify_payload(event_id, payload, metadata))
161
+ )
162
+ await driver.commit()
163
+ self._runtime.increment_metric("events.publish.native")
164
+ return event_id
165
+
166
+ async def dequeue(self, channel: str, poll_interval: float) -> EventMessage | None:
167
+ hub = self._ensure_hub()
168
+ payload = await hub.dequeue(channel, poll_interval)
169
+ if payload is None:
170
+ return None
171
+ return decode_notify_payload(channel, payload)
172
+
173
+ async def ack(self, _event_id: str) -> None:
174
+ self._runtime.increment_metric("events.ack")
175
+
176
+ async def nack(self, _event_id: str) -> None:
177
+ """Return an event to the queue (no-op for native LISTEN/NOTIFY)."""
178
+
179
+ async def shutdown(self) -> None:
180
+ hub = self._hub
181
+ if hub is not None:
182
+ self._hub = None
183
+ await hub.shutdown()
184
+
185
+ def _ensure_hub(self) -> AsyncpgListenerHub:
186
+ if self._hub is None:
187
+ self._hub = AsyncpgListenerHub(self._config)
188
+ return self._hub
189
+
190
+
191
+ def create_event_backend(
192
+ config: "AsyncpgConfig", backend_name: str, extension_settings: "dict[str, Any]"
193
+ ) -> AsyncpgEventsBackend | AsyncpgHybridEventsBackend | None:
194
+ """Factory used by EventChannel to create the native backend."""
195
+ match backend_name:
196
+ case "listen_notify":
197
+ try:
198
+ return AsyncpgEventsBackend(config)
199
+ except ImproperConfigurationError:
200
+ return None
201
+ case "listen_notify_durable":
202
+ queue_backend = cast(
203
+ "AsyncTableEventQueue", build_queue_backend(config, extension_settings, adapter_name="asyncpg")
204
+ )
205
+ try:
206
+ return AsyncpgHybridEventsBackend(config, queue_backend)
207
+ except ImproperConfigurationError:
208
+ return None
209
+ case _:
210
+ return None
@@ -0,0 +1,40 @@
1
+ """AsyncPG event queue store for PostgreSQL JSONB storage."""
2
+
3
+ from sqlspec.adapters.asyncpg.config import AsyncpgConfig
4
+ from sqlspec.extensions.events import BaseEventQueueStore
5
+
6
+ __all__ = ("AsyncpgEventQueueStore",)
7
+
8
+
9
+ class AsyncpgEventQueueStore(BaseEventQueueStore[AsyncpgConfig]):
10
+ """PostgreSQL event queue store with JSONB columns.
11
+
12
+ Uses PostgreSQL-native JSONB for efficient JSON storage and querying.
13
+ TIMESTAMPTZ ensures proper timezone handling.
14
+
15
+ Args:
16
+ config: AsyncpgConfig with extension_config["events"] settings.
17
+
18
+ Notes:
19
+ Configuration is read from config.extension_config["events"]:
20
+ - queue_table: Table name (default: "sqlspec_event_queue")
21
+
22
+ Example:
23
+ from sqlspec.adapters.asyncpg import AsyncpgConfig
24
+ from sqlspec.adapters.asyncpg.events import AsyncpgEventQueueStore
25
+
26
+ config = AsyncpgConfig(connection_config={"dsn": "postgresql://..."})
27
+ store = AsyncpgEventQueueStore(config)
28
+ for stmt in store.create_statements():
29
+ await driver.execute_script(stmt)
30
+ """
31
+
32
+ __slots__ = ()
33
+
34
+ def _column_types(self) -> "tuple[str, str, str]":
35
+ """Return PostgreSQL-native column types.
36
+
37
+ Returns:
38
+ Tuple of (payload_type, metadata_type, timestamp_type).
39
+ """
40
+ return "JSONB", "JSONB", "TIMESTAMPTZ"
@@ -0,0 +1,5 @@
1
+ """Litestar integration for AsyncPG adapter."""
2
+
3
+ from sqlspec.adapters.asyncpg.litestar.store import AsyncpgStore
4
+
5
+ __all__ = ("AsyncpgStore",)
@@ -0,0 +1,251 @@
1
+ """AsyncPG session store for Litestar integration."""
2
+
3
+ from datetime import datetime, timedelta, timezone
4
+ from typing import TYPE_CHECKING
5
+
6
+ from sqlspec.extensions.litestar.store import BaseSQLSpecStore
7
+
8
+ if TYPE_CHECKING:
9
+ from sqlspec.adapters.asyncpg.config import AsyncpgConfig
10
+
11
+
12
+ __all__ = ("AsyncpgStore",)
13
+
14
+
15
+ class AsyncpgStore(BaseSQLSpecStore["AsyncpgConfig"]):
16
+ """PostgreSQL session store using AsyncPG driver.
17
+
18
+ Implements server-side session storage for Litestar using PostgreSQL
19
+ via the AsyncPG driver. Provides efficient session management with:
20
+ - Native async PostgreSQL operations
21
+ - UPSERT support using ON CONFLICT
22
+ - Automatic expiration handling
23
+ - Efficient cleanup of expired sessions
24
+
25
+ Args:
26
+ config: AsyncpgConfig instance with extension_config["litestar"] settings.
27
+
28
+ Example:
29
+ from sqlspec.adapters.asyncpg import AsyncpgConfig
30
+ from sqlspec.adapters.asyncpg.litestar.store import AsyncpgStore
31
+
32
+ config = AsyncpgConfig(
33
+ connection_config={"dsn": "postgresql://..."},
34
+ extension_config={"litestar": {"session_table": "my_sessions"}}
35
+ )
36
+ store = AsyncpgStore(config)
37
+ await store.create_table()
38
+ """
39
+
40
+ __slots__ = ()
41
+
42
+ def __init__(self, config: "AsyncpgConfig") -> None:
43
+ """Initialize AsyncPG session store.
44
+
45
+ Args:
46
+ config: AsyncpgConfig instance.
47
+
48
+ Notes:
49
+ Table name is read from config.extension_config["litestar"]["session_table"].
50
+ """
51
+ super().__init__(config)
52
+
53
+ def _get_create_table_sql(self) -> str:
54
+ """Get PostgreSQL CREATE TABLE SQL with optimized schema.
55
+
56
+ Returns:
57
+ SQL statement to create the sessions table with proper indexes.
58
+
59
+ Notes:
60
+ - Uses TIMESTAMPTZ for timezone-aware expiration timestamps
61
+ - Partial index WHERE expires_at IS NOT NULL reduces index size/maintenance
62
+ - FILLFACTOR 80 leaves space for HOT updates, reducing table bloat
63
+ - Audit columns (created_at, updated_at) help with debugging
64
+ - Table name is internally controlled, not user input (S608 suppressed)
65
+ """
66
+ return f"""
67
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
68
+ session_id TEXT PRIMARY KEY,
69
+ data BYTEA NOT NULL,
70
+ expires_at TIMESTAMPTZ,
71
+ created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
72
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
73
+ ) WITH (fillfactor = 80);
74
+
75
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
76
+ ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
77
+
78
+ ALTER TABLE {self._table_name} SET (
79
+ autovacuum_vacuum_scale_factor = 0.05,
80
+ autovacuum_analyze_scale_factor = 0.02
81
+ );
82
+ """
83
+
84
+ def _get_drop_table_sql(self) -> "list[str]":
85
+ """Get PostgreSQL DROP TABLE SQL statements.
86
+
87
+ Returns:
88
+ List of SQL statements to drop indexes and table.
89
+ """
90
+ return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
91
+
92
+ async def create_table(self) -> None:
93
+ """Create the session table if it doesn't exist."""
94
+ sql = self._get_create_table_sql()
95
+ async with self._config.provide_session() as driver:
96
+ await driver.execute_script(sql)
97
+ self._log_table_created()
98
+
99
+ async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
100
+ """Get a session value by key.
101
+
102
+ Args:
103
+ key: Session ID to retrieve.
104
+ renew_for: If given, renew the expiry time for this duration.
105
+
106
+ Returns:
107
+ Session data as bytes if found and not expired, None otherwise.
108
+
109
+ Notes:
110
+ Uses CURRENT_TIMESTAMP instead of NOW() for SQL standard compliance.
111
+ The query planner can use the partial index for expires_at > CURRENT_TIMESTAMP.
112
+ """
113
+ sql = f"""
114
+ SELECT data, expires_at FROM {self._table_name}
115
+ WHERE session_id = $1
116
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
117
+ """
118
+
119
+ async with self._config.provide_connection() as conn:
120
+ row = await conn.fetchrow(sql, key)
121
+
122
+ if row is None:
123
+ return None
124
+
125
+ if renew_for is not None and row["expires_at"] is not None:
126
+ new_expires_at = self._calculate_expires_at(renew_for)
127
+ if new_expires_at is not None:
128
+ update_sql = f"""
129
+ UPDATE {self._table_name}
130
+ SET expires_at = $1, updated_at = CURRENT_TIMESTAMP
131
+ WHERE session_id = $2
132
+ """
133
+ await conn.execute(update_sql, new_expires_at, key)
134
+
135
+ return bytes(row["data"])
136
+
137
+ async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
138
+ """Store a session value.
139
+
140
+ Args:
141
+ key: Session ID.
142
+ value: Session data.
143
+ expires_in: Time until expiration.
144
+
145
+ Notes:
146
+ Uses EXCLUDED to reference the proposed insert values in ON CONFLICT.
147
+ Updates updated_at timestamp on every write for audit trail.
148
+ """
149
+ data = self._value_to_bytes(value)
150
+ expires_at = self._calculate_expires_at(expires_in)
151
+
152
+ sql = f"""
153
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
154
+ VALUES ($1, $2, $3)
155
+ ON CONFLICT (session_id)
156
+ DO UPDATE SET
157
+ data = EXCLUDED.data,
158
+ expires_at = EXCLUDED.expires_at,
159
+ updated_at = CURRENT_TIMESTAMP
160
+ """
161
+
162
+ async with self._config.provide_connection() as conn:
163
+ await conn.execute(sql, key, data, expires_at)
164
+
165
+ async def delete(self, key: str) -> None:
166
+ """Delete a session by key.
167
+
168
+ Args:
169
+ key: Session ID to delete.
170
+ """
171
+ sql = f"DELETE FROM {self._table_name} WHERE session_id = $1"
172
+
173
+ async with self._config.provide_connection() as conn:
174
+ await conn.execute(sql, key)
175
+
176
+ async def delete_all(self) -> None:
177
+ """Delete all sessions from the store."""
178
+ sql = f"DELETE FROM {self._table_name}"
179
+
180
+ async with self._config.provide_connection() as conn:
181
+ await conn.execute(sql)
182
+ self._log_delete_all()
183
+
184
+ async def exists(self, key: str) -> bool:
185
+ """Check if a session key exists and is not expired.
186
+
187
+ Args:
188
+ key: Session ID to check.
189
+
190
+ Returns:
191
+ True if the session exists and is not expired.
192
+
193
+ Notes:
194
+ Uses CURRENT_TIMESTAMP for consistency with get() method.
195
+ """
196
+ sql = f"""
197
+ SELECT 1 FROM {self._table_name}
198
+ WHERE session_id = $1
199
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
200
+ """
201
+
202
+ async with self._config.provide_connection() as conn:
203
+ result = await conn.fetchval(sql, key)
204
+ return result is not None
205
+
206
+ async def expires_in(self, key: str) -> "int | None":
207
+ """Get the time in seconds until the session expires.
208
+
209
+ Args:
210
+ key: Session ID to check.
211
+
212
+ Returns:
213
+ Seconds until expiration, or None if no expiry or key doesn't exist.
214
+ """
215
+ sql = f"""
216
+ SELECT expires_at FROM {self._table_name}
217
+ WHERE session_id = $1
218
+ """
219
+
220
+ async with self._config.provide_connection() as conn:
221
+ expires_at = await conn.fetchval(sql, key)
222
+
223
+ if expires_at is None:
224
+ return None
225
+
226
+ now = datetime.now(timezone.utc)
227
+ if expires_at <= now:
228
+ return 0
229
+
230
+ delta = expires_at - now
231
+ return int(delta.total_seconds())
232
+
233
+ async def delete_expired(self) -> int:
234
+ """Delete all expired sessions.
235
+
236
+ Returns:
237
+ Number of sessions deleted.
238
+
239
+ Notes:
240
+ Uses CURRENT_TIMESTAMP for consistency.
241
+ For very large tables (10M+ rows), consider batching deletes
242
+ to avoid holding locks too long.
243
+ """
244
+ sql = f"DELETE FROM {self._table_name} WHERE expires_at <= CURRENT_TIMESTAMP"
245
+
246
+ async with self._config.provide_connection() as conn:
247
+ result = await conn.execute(sql)
248
+ count = int(result.split()[-1])
249
+ if count > 0:
250
+ self._log_delete_expired(count)
251
+ return count
@@ -0,0 +1,15 @@
1
+ from sqlspec.adapters.bigquery._typing import BigQueryConnection, BigQueryCursor
2
+ from sqlspec.adapters.bigquery.config import BigQueryConfig, BigQueryConnectionParams, BigQueryDriverFeatures
3
+ from sqlspec.adapters.bigquery.core import default_statement_config
4
+ from sqlspec.adapters.bigquery.driver import BigQueryDriver, BigQueryExceptionHandler
5
+
6
+ __all__ = (
7
+ "BigQueryConfig",
8
+ "BigQueryConnection",
9
+ "BigQueryConnectionParams",
10
+ "BigQueryCursor",
11
+ "BigQueryDriver",
12
+ "BigQueryDriverFeatures",
13
+ "BigQueryExceptionHandler",
14
+ "default_statement_config",
15
+ )
@@ -0,0 +1,108 @@
1
+ """BigQuery 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
+ import logging
8
+ from typing import TYPE_CHECKING, Any
9
+
10
+ from google.cloud.bigquery import ArrayQueryParameter, Client, QueryJob, ScalarQueryParameter
11
+
12
+ if TYPE_CHECKING:
13
+ from collections.abc import Callable
14
+ from types import TracebackType
15
+ from typing import TypeAlias
16
+
17
+ from sqlspec.adapters.bigquery.driver import BigQueryDriver
18
+ from sqlspec.core import StatementConfig
19
+
20
+ BigQueryConnection: TypeAlias = Client
21
+ BigQueryParam: TypeAlias = ArrayQueryParameter | ScalarQueryParameter
22
+
23
+ if not TYPE_CHECKING:
24
+ BigQueryConnection = Client
25
+ BigQueryParam = ArrayQueryParameter | ScalarQueryParameter
26
+
27
+
28
+ class BigQueryCursor:
29
+ """BigQuery cursor with resource management."""
30
+
31
+ __slots__ = ("connection", "job")
32
+
33
+ def __init__(self, connection: "BigQueryConnection") -> None:
34
+ self.connection = connection
35
+ self.job: QueryJob | None = None
36
+
37
+ def __enter__(self) -> "BigQueryConnection":
38
+ return self.connection
39
+
40
+ def __exit__(self, *_: Any) -> None:
41
+ """Clean up cursor resources including active QueryJobs."""
42
+ if self.job is not None:
43
+ try:
44
+ # Cancel the job if it's still running to free up resources
45
+ if self.job.state in {"PENDING", "RUNNING"}:
46
+ self.job.cancel()
47
+ # Clear the job reference
48
+ self.job = None
49
+ except Exception:
50
+ logging.getLogger(__name__).exception("Failed to cancel BigQuery job during cursor cleanup")
51
+
52
+
53
+ class BigQuerySessionContext:
54
+ """Sync context manager for BigQuery sessions.
55
+
56
+ This class is intentionally excluded from mypyc compilation to avoid ABI
57
+ boundary issues. It receives callables from uncompiled config classes and
58
+ instantiates compiled Driver objects, acting as a bridge between compiled
59
+ and uncompiled code.
60
+
61
+ Uses callable-based connection management to decouple from config implementation.
62
+ """
63
+
64
+ __slots__ = (
65
+ "_acquire_connection",
66
+ "_connection",
67
+ "_driver",
68
+ "_driver_features",
69
+ "_prepare_driver",
70
+ "_release_connection",
71
+ "_statement_config",
72
+ )
73
+
74
+ def __init__(
75
+ self,
76
+ acquire_connection: "Callable[[], Any]",
77
+ release_connection: "Callable[[Any], Any]",
78
+ statement_config: "StatementConfig",
79
+ driver_features: "dict[str, Any]",
80
+ prepare_driver: "Callable[[BigQueryDriver], BigQueryDriver]",
81
+ ) -> None:
82
+ self._acquire_connection = acquire_connection
83
+ self._release_connection = release_connection
84
+ self._statement_config = statement_config
85
+ self._driver_features = driver_features
86
+ self._prepare_driver = prepare_driver
87
+ self._connection: Any = None
88
+ self._driver: BigQueryDriver | None = None
89
+
90
+ def __enter__(self) -> "BigQueryDriver":
91
+ from sqlspec.adapters.bigquery.driver import BigQueryDriver
92
+
93
+ self._connection = self._acquire_connection()
94
+ self._driver = BigQueryDriver(
95
+ connection=self._connection, statement_config=self._statement_config, driver_features=self._driver_features
96
+ )
97
+ return self._prepare_driver(self._driver)
98
+
99
+ def __exit__(
100
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
101
+ ) -> "bool | None":
102
+ if self._connection is not None:
103
+ self._release_connection(self._connection)
104
+ self._connection = None
105
+ return None
106
+
107
+
108
+ __all__ = ("BigQueryConnection", "BigQueryCursor", "BigQueryParam", "BigQuerySessionContext")