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,270 @@
1
+ """Psqlpy 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.psqlpy.config import PsqlpyConfig
10
+
11
+
12
+ __all__ = ("PsqlpyStore",)
13
+
14
+
15
+ class PsqlpyStore(BaseSQLSpecStore["PsqlpyConfig"]):
16
+ """PostgreSQL session store using Psqlpy driver.
17
+
18
+ Implements server-side session storage for Litestar using PostgreSQL
19
+ via the Psqlpy driver (Rust-based async driver). Provides efficient
20
+ session management with:
21
+ - Native async PostgreSQL operations via Rust
22
+ - UPSERT support using ON CONFLICT
23
+ - Automatic expiration handling
24
+ - Efficient cleanup of expired sessions
25
+
26
+ Args:
27
+ config: PsqlpyConfig instance.
28
+
29
+ Example:
30
+ from sqlspec.adapters.psqlpy import PsqlpyConfig
31
+ from sqlspec.adapters.psqlpy.litestar.store import PsqlpyStore
32
+
33
+ config = PsqlpyConfig(connection_config={"dsn": "postgresql://..."})
34
+ store = PsqlpyStore(config)
35
+ await store.create_table()
36
+ """
37
+
38
+ __slots__ = ()
39
+
40
+ def __init__(self, config: "PsqlpyConfig") -> None:
41
+ """Initialize Psqlpy session store.
42
+
43
+ Args:
44
+ config: PsqlpyConfig instance.
45
+
46
+ Notes:
47
+ Table name is read from config.extension_config["litestar"]["session_table"].
48
+ """
49
+ super().__init__(config)
50
+
51
+ def _get_create_table_sql(self) -> str:
52
+ """Get PostgreSQL CREATE TABLE SQL with optimized schema.
53
+
54
+ Returns:
55
+ SQL statement to create the sessions table with proper indexes.
56
+
57
+ Notes:
58
+ - Uses TIMESTAMPTZ for timezone-aware expiration timestamps
59
+ - Partial index WHERE expires_at IS NOT NULL reduces index size/maintenance
60
+ - FILLFACTOR 80 leaves space for HOT updates, reducing table bloat
61
+ - Audit columns (created_at, updated_at) help with debugging
62
+ - Table name is internally controlled, not user input (S608 suppressed)
63
+ """
64
+ return f"""
65
+ CREATE TABLE IF NOT EXISTS {self._table_name} (
66
+ session_id TEXT PRIMARY KEY,
67
+ data BYTEA NOT NULL,
68
+ expires_at TIMESTAMPTZ,
69
+ created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
70
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP
71
+ ) WITH (fillfactor = 80);
72
+
73
+ CREATE INDEX IF NOT EXISTS idx_{self._table_name}_expires_at
74
+ ON {self._table_name}(expires_at) WHERE expires_at IS NOT NULL;
75
+
76
+ ALTER TABLE {self._table_name} SET (
77
+ autovacuum_vacuum_scale_factor = 0.05,
78
+ autovacuum_analyze_scale_factor = 0.02
79
+ );
80
+ """
81
+
82
+ def _get_drop_table_sql(self) -> "list[str]":
83
+ """Get PostgreSQL DROP TABLE SQL statements.
84
+
85
+ Returns:
86
+ List of SQL statements to drop indexes and table.
87
+ """
88
+ return [f"DROP INDEX IF EXISTS idx_{self._table_name}_expires_at", f"DROP TABLE IF EXISTS {self._table_name}"]
89
+
90
+ async def create_table(self) -> None:
91
+ """Create the session table if it doesn't exist."""
92
+ sql = self._get_create_table_sql()
93
+ async with self._config.provide_session() as driver:
94
+ await driver.execute_script(sql)
95
+ self._log_table_created()
96
+
97
+ async def get(self, key: str, renew_for: "int | timedelta | None" = None) -> "bytes | None":
98
+ """Get a session value by key.
99
+
100
+ Args:
101
+ key: Session ID to retrieve.
102
+ renew_for: If given, renew the expiry time for this duration.
103
+
104
+ Returns:
105
+ Session data as bytes if found and not expired, None otherwise.
106
+
107
+ Notes:
108
+ Uses CURRENT_TIMESTAMP instead of NOW() for SQL standard compliance.
109
+ The query planner can use the partial index for expires_at > CURRENT_TIMESTAMP.
110
+ """
111
+ sql = f"""
112
+ SELECT data, expires_at FROM {self._table_name}
113
+ WHERE session_id = $1
114
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
115
+ """
116
+
117
+ async with self._config.provide_connection() as conn:
118
+ query_result = await conn.fetch(sql, [key])
119
+ rows = query_result.result()
120
+
121
+ if not rows:
122
+ return None
123
+
124
+ row = rows[0]
125
+
126
+ if renew_for is not None and row["expires_at"] is not None:
127
+ new_expires_at = self._calculate_expires_at(renew_for)
128
+ if new_expires_at is not None:
129
+ update_sql = f"""
130
+ UPDATE {self._table_name}
131
+ SET expires_at = $1, updated_at = CURRENT_TIMESTAMP
132
+ WHERE session_id = $2
133
+ """
134
+ await conn.execute(update_sql, [new_expires_at, key])
135
+
136
+ return bytes(row["data"])
137
+
138
+ async def set(self, key: str, value: "str | bytes", expires_in: "int | timedelta | None" = None) -> None:
139
+ """Store a session value.
140
+
141
+ Args:
142
+ key: Session ID.
143
+ value: Session data.
144
+ expires_in: Time until expiration.
145
+
146
+ Notes:
147
+ Uses EXCLUDED to reference the proposed insert values in ON CONFLICT.
148
+ Updates updated_at timestamp on every write for audit trail.
149
+ """
150
+ data = self._value_to_bytes(value)
151
+ expires_at = self._calculate_expires_at(expires_in)
152
+
153
+ sql = f"""
154
+ INSERT INTO {self._table_name} (session_id, data, expires_at)
155
+ VALUES ($1, $2, $3)
156
+ ON CONFLICT (session_id)
157
+ DO UPDATE SET
158
+ data = EXCLUDED.data,
159
+ expires_at = EXCLUDED.expires_at,
160
+ updated_at = CURRENT_TIMESTAMP
161
+ """
162
+
163
+ async with self._config.provide_connection() as conn:
164
+ await conn.execute(sql, [key, data, expires_at])
165
+
166
+ async def delete(self, key: str) -> None:
167
+ """Delete a session by key.
168
+
169
+ Args:
170
+ key: Session ID to delete.
171
+ """
172
+ sql = f"DELETE FROM {self._table_name} WHERE session_id = $1"
173
+
174
+ async with self._config.provide_connection() as conn:
175
+ await conn.execute(sql, [key])
176
+
177
+ async def delete_all(self) -> None:
178
+ """Delete all sessions from the store."""
179
+ sql = f"DELETE FROM {self._table_name}"
180
+
181
+ async with self._config.provide_connection() as conn:
182
+ await conn.execute(sql)
183
+ self._log_delete_all()
184
+
185
+ async def exists(self, key: str) -> bool:
186
+ """Check if a session key exists and is not expired.
187
+
188
+ Args:
189
+ key: Session ID to check.
190
+
191
+ Returns:
192
+ True if the session exists and is not expired.
193
+
194
+ Notes:
195
+ Uses CURRENT_TIMESTAMP for consistency with get() method.
196
+ Uses fetch() instead of fetch_val() to handle zero-row case.
197
+ """
198
+ sql = f"""
199
+ SELECT 1 FROM {self._table_name}
200
+ WHERE session_id = $1
201
+ AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
202
+ """
203
+
204
+ async with self._config.provide_connection() as conn:
205
+ query_result = await conn.fetch(sql, [key])
206
+ rows = query_result.result()
207
+ return len(rows) > 0
208
+
209
+ async def expires_in(self, key: str) -> "int | None":
210
+ """Get the time in seconds until the session expires.
211
+
212
+ Args:
213
+ key: Session ID to check.
214
+
215
+ Returns:
216
+ Seconds until expiration, or None if no expiry or key doesn't exist.
217
+
218
+ Notes:
219
+ Uses fetch() to handle the case where the key doesn't exist.
220
+ """
221
+ sql = f"""
222
+ SELECT expires_at FROM {self._table_name}
223
+ WHERE session_id = $1
224
+ """
225
+
226
+ async with self._config.provide_connection() as conn:
227
+ query_result = await conn.fetch(sql, [key])
228
+ rows = query_result.result()
229
+
230
+ if not rows:
231
+ return None
232
+
233
+ expires_at = rows[0]["expires_at"]
234
+
235
+ if expires_at is None:
236
+ return None
237
+
238
+ now = datetime.now(timezone.utc)
239
+ if expires_at <= now:
240
+ return 0
241
+
242
+ delta = expires_at - now
243
+ return int(delta.total_seconds())
244
+
245
+ async def delete_expired(self) -> int:
246
+ """Delete all expired sessions.
247
+
248
+ Returns:
249
+ Number of sessions deleted.
250
+
251
+ Notes:
252
+ Uses CURRENT_TIMESTAMP for consistency.
253
+ Uses RETURNING to get deleted row count since psqlpy QueryResult
254
+ doesn't expose command tags.
255
+ For very large tables (10M+ rows), consider batching deletes
256
+ to avoid holding locks too long.
257
+ """
258
+ sql = f"""
259
+ DELETE FROM {self._table_name}
260
+ WHERE expires_at <= CURRENT_TIMESTAMP
261
+ RETURNING session_id
262
+ """
263
+
264
+ async with self._config.provide_connection() as conn:
265
+ query_result = await conn.fetch(sql, [])
266
+ rows = query_result.result()
267
+ count = len(rows)
268
+ if count > 0:
269
+ self._log_delete_expired(count)
270
+ return count
@@ -0,0 +1,113 @@
1
+ """PostgreSQL-specific type conversion for psqlpy adapter.
2
+
3
+ Combines output conversion (database results → Python) and input conversion
4
+ (Python params → PostgreSQL format) in a single module. Designed for mypyc
5
+ compilation with no nested functions.
6
+
7
+ Output conversion handles:
8
+ - PostgreSQL-specific types like intervals and arrays
9
+ - Standard type detection (UUID, JSON, datetime, etc.)
10
+
11
+ Input conversion handles:
12
+ - pgvector type handlers (placeholder for future support)
13
+ """
14
+
15
+ import re
16
+ from typing import TYPE_CHECKING, Any, Final
17
+
18
+ from sqlspec.core.type_converter import CachedOutputConverter
19
+ from sqlspec.typing import PGVECTOR_INSTALLED
20
+ from sqlspec.utils.logging import get_logger
21
+
22
+ if TYPE_CHECKING:
23
+ from psqlpy import Connection
24
+
25
+ __all__ = ("PG_SPECIAL_CHARS", "PG_SPECIFIC_REGEX", "PostgreSQLOutputConverter", "register_pgvector")
26
+
27
+ logger = get_logger(__name__)
28
+
29
+ PG_SPECIFIC_REGEX: Final[re.Pattern[str]] = re.compile(
30
+ r"^(?:"
31
+ r"(?P<interval>(?:(?:\d+\s+(?:year|month|day|hour|minute|second)s?\s*)+)|(?:P(?:\d+Y)?(?:\d+M)?(?:\d+D)?(?:T(?:\d+H)?(?:\d+M)?(?:\d+(?:\.\d+)?S)?)?))|"
32
+ r"(?P<pg_array>\{(?:[^{}]+|\{[^{}]*\})*\})"
33
+ r")$",
34
+ re.IGNORECASE,
35
+ )
36
+
37
+ PG_SPECIAL_CHARS: Final[frozenset[str]] = frozenset({"{", "-", ":", "T", ".", "P", "[", "Y", "M", "D", "H", "S"})
38
+
39
+
40
+ class PostgreSQLOutputConverter(CachedOutputConverter):
41
+ """PostgreSQL-specific output conversion with interval and array support.
42
+
43
+ Extends CachedOutputConverter with PostgreSQL-specific functionality
44
+ for interval and array type handling.
45
+ """
46
+
47
+ __slots__ = ()
48
+
49
+ def __init__(self, cache_size: int = 5000) -> None:
50
+ """Initialize converter with PostgreSQL-specific options.
51
+
52
+ Args:
53
+ cache_size: Maximum number of string values to cache (default: 5000)
54
+ """
55
+ super().__init__(special_chars=PG_SPECIAL_CHARS, cache_size=cache_size)
56
+
57
+ def _convert_detected(self, value: str, detected_type: str) -> Any:
58
+ """Convert value with PostgreSQL-specific handling.
59
+
60
+ Args:
61
+ value: String value to convert.
62
+ detected_type: Detected type name.
63
+
64
+ Returns:
65
+ Converted value or original for PostgreSQL-specific types.
66
+ """
67
+ if detected_type in {"interval", "pg_array"}:
68
+ return value
69
+ try:
70
+ return self.convert_value(value, detected_type)
71
+ except Exception:
72
+ return value
73
+
74
+ def detect_type(self, value: str) -> "str | None":
75
+ """Detect types including PostgreSQL-specific types.
76
+
77
+ Args:
78
+ value: String value to analyze.
79
+
80
+ Returns:
81
+ Type name if detected, None otherwise.
82
+ """
83
+ detected_type = super().detect_type(value)
84
+ if detected_type:
85
+ return detected_type
86
+
87
+ match = PG_SPECIFIC_REGEX.match(value)
88
+ if match:
89
+ for group_name in ["interval", "pg_array"]:
90
+ if match.group(group_name):
91
+ return group_name
92
+
93
+ return None
94
+
95
+
96
+ def register_pgvector(connection: "Connection") -> None:
97
+ """Register pgvector type handlers on psqlpy connection.
98
+
99
+ Currently a placeholder for future implementation. The psqlpy library
100
+ does not yet expose a type handler registration API compatible with
101
+ pgvector's automatic conversion system.
102
+
103
+ Args:
104
+ connection: Psqlpy connection instance.
105
+
106
+ Note:
107
+ When psqlpy adds type handler support, this function will:
108
+ - Register pgvector extension on the connection
109
+ - Enable automatic NumPy array <-> PostgreSQL vector conversion
110
+ - Support vector similarity search operations
111
+ """
112
+ if not PGVECTOR_INSTALLED:
113
+ return
@@ -0,0 +1,38 @@
1
+ from sqlspec.adapters.psycopg._typing import (
2
+ PsycopgAsyncConnection,
3
+ PsycopgAsyncCursor,
4
+ PsycopgSyncConnection,
5
+ PsycopgSyncCursor,
6
+ )
7
+ from sqlspec.adapters.psycopg.config import (
8
+ PsycopgAsyncConfig,
9
+ PsycopgConnectionParams,
10
+ PsycopgDriverFeatures,
11
+ PsycopgPoolParams,
12
+ PsycopgSyncConfig,
13
+ )
14
+ from sqlspec.adapters.psycopg.core import default_statement_config
15
+ from sqlspec.adapters.psycopg.driver import (
16
+ PsycopgAsyncDriver,
17
+ PsycopgAsyncExceptionHandler,
18
+ PsycopgSyncDriver,
19
+ PsycopgSyncExceptionHandler,
20
+ )
21
+ from sqlspec.dialects import postgres # noqa: F401
22
+
23
+ __all__ = (
24
+ "PsycopgAsyncConfig",
25
+ "PsycopgAsyncConnection",
26
+ "PsycopgAsyncCursor",
27
+ "PsycopgAsyncDriver",
28
+ "PsycopgAsyncExceptionHandler",
29
+ "PsycopgConnectionParams",
30
+ "PsycopgDriverFeatures",
31
+ "PsycopgPoolParams",
32
+ "PsycopgSyncConfig",
33
+ "PsycopgSyncConnection",
34
+ "PsycopgSyncCursor",
35
+ "PsycopgSyncDriver",
36
+ "PsycopgSyncExceptionHandler",
37
+ "default_statement_config",
38
+ )
@@ -0,0 +1,218 @@
1
+ """Psycopg adapter type definitions.
2
+
3
+ This module contains type aliases and classes that are excluded from mypyc
4
+ compilation to avoid ABI boundary issues.
5
+ """
6
+
7
+ from typing import TYPE_CHECKING, Any, Protocol
8
+
9
+ from psycopg import AsyncConnection, AsyncCursor, Connection, Cursor
10
+ from psycopg.rows import DictRow as PsycopgDictRow
11
+ from psycopg.sql import SQL as PsycopgSQL # noqa: N811
12
+ from psycopg.sql import Composed as PsycopgComposed
13
+ from psycopg.sql import Identifier as PsycopgIdentifier
14
+
15
+ if TYPE_CHECKING:
16
+ from collections.abc import Callable
17
+ from types import TracebackType
18
+ from typing import TypeAlias
19
+
20
+ from sqlspec.adapters.psycopg.driver import PsycopgAsyncDriver, PsycopgSyncDriver
21
+ from sqlspec.builder import QueryBuilder
22
+ from sqlspec.core import SQL, Statement, StatementConfig
23
+
24
+ PsycopgSyncConnection: TypeAlias = Connection[PsycopgDictRow]
25
+ PsycopgAsyncConnection: TypeAlias = AsyncConnection[PsycopgDictRow]
26
+ PsycopgSyncRawCursor: TypeAlias = Cursor[PsycopgDictRow]
27
+ PsycopgAsyncRawCursor: TypeAlias = AsyncCursor[PsycopgDictRow]
28
+
29
+ if not TYPE_CHECKING:
30
+ PsycopgSyncConnection = Connection
31
+ PsycopgAsyncConnection = AsyncConnection
32
+ PsycopgSyncRawCursor = Cursor
33
+ PsycopgAsyncRawCursor = AsyncCursor
34
+
35
+
36
+ class PsycopgSyncCursor:
37
+ """Context manager for PostgreSQL psycopg cursor management."""
38
+
39
+ __slots__ = ("connection", "cursor")
40
+
41
+ def __init__(self, connection: "PsycopgSyncConnection") -> None:
42
+ self.connection = connection
43
+ self.cursor: PsycopgSyncRawCursor | None = None
44
+
45
+ def __enter__(self) -> "PsycopgSyncRawCursor":
46
+ self.cursor = self.connection.cursor()
47
+ return self.cursor
48
+
49
+ def __exit__(self, *_: Any) -> None:
50
+ if self.cursor is not None:
51
+ self.cursor.close()
52
+
53
+
54
+ class PsycopgAsyncCursor:
55
+ """Async context manager for PostgreSQL psycopg cursor management."""
56
+
57
+ __slots__ = ("connection", "cursor")
58
+
59
+ def __init__(self, connection: "PsycopgAsyncConnection") -> None:
60
+ self.connection = connection
61
+ self.cursor: PsycopgAsyncRawCursor | None = None
62
+
63
+ async def __aenter__(self) -> "PsycopgAsyncRawCursor":
64
+ self.cursor = self.connection.cursor()
65
+ return self.cursor
66
+
67
+ async def __aexit__(
68
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
69
+ ) -> None:
70
+ _ = (exc_type, exc_val, exc_tb)
71
+ if self.cursor is not None:
72
+ await self.cursor.close()
73
+
74
+
75
+ class PsycopgPipelineDriver(Protocol):
76
+ """Protocol for psycopg pipeline driver methods used in stack execution."""
77
+
78
+ statement_config: "StatementConfig"
79
+
80
+ def prepare_statement(
81
+ self,
82
+ statement: "SQL | Statement | QueryBuilder",
83
+ parameters: Any,
84
+ *,
85
+ statement_config: "StatementConfig | None" = None,
86
+ kwargs: "dict[str, Any] | None" = None,
87
+ ) -> "SQL": ...
88
+
89
+ def _get_compiled_sql(self, statement: "SQL", statement_config: "StatementConfig") -> "tuple[str, Any]": ...
90
+
91
+
92
+ class PsycopgSyncSessionContext:
93
+ """Sync context manager for psycopg sessions.
94
+
95
+ This class is intentionally excluded from mypyc compilation to avoid ABI
96
+ boundary issues. It receives callables from uncompiled config classes and
97
+ instantiates compiled Driver objects, acting as a bridge between compiled
98
+ and uncompiled code.
99
+
100
+ Uses callable-based connection management to decouple from config implementation.
101
+ """
102
+
103
+ __slots__ = (
104
+ "_acquire_connection",
105
+ "_connection",
106
+ "_driver",
107
+ "_driver_features",
108
+ "_prepare_driver",
109
+ "_release_connection",
110
+ "_statement_config",
111
+ )
112
+
113
+ def __init__(
114
+ self,
115
+ acquire_connection: "Callable[[], Any]",
116
+ release_connection: "Callable[[Any], Any]",
117
+ statement_config: "StatementConfig | Callable[[], StatementConfig]",
118
+ driver_features: "dict[str, Any]",
119
+ prepare_driver: "Callable[[PsycopgSyncDriver], PsycopgSyncDriver]",
120
+ ) -> None:
121
+ self._acquire_connection = acquire_connection
122
+ self._release_connection = release_connection
123
+ self._statement_config = statement_config
124
+ self._driver_features = driver_features
125
+ self._prepare_driver = prepare_driver
126
+ self._connection: Any = None
127
+ self._driver: PsycopgSyncDriver | None = None
128
+
129
+ def __enter__(self) -> "PsycopgSyncDriver":
130
+ from sqlspec.adapters.psycopg.driver import PsycopgSyncDriver
131
+
132
+ self._connection = self._acquire_connection()
133
+ statement_config = self._statement_config() if callable(self._statement_config) else self._statement_config
134
+ self._driver = PsycopgSyncDriver(
135
+ connection=self._connection, statement_config=statement_config, driver_features=self._driver_features
136
+ )
137
+ return self._prepare_driver(self._driver)
138
+
139
+ def __exit__(
140
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
141
+ ) -> "bool | None":
142
+ if self._connection is not None:
143
+ self._release_connection(self._connection)
144
+ self._connection = None
145
+ return None
146
+
147
+
148
+ class PsycopgAsyncSessionContext:
149
+ """Async context manager for psycopg sessions.
150
+
151
+ This class is intentionally excluded from mypyc compilation to avoid ABI
152
+ boundary issues. It receives callables from uncompiled config classes and
153
+ instantiates compiled Driver objects, acting as a bridge between compiled
154
+ and uncompiled code.
155
+
156
+ Uses callable-based connection management to decouple from config implementation.
157
+ """
158
+
159
+ __slots__ = (
160
+ "_acquire_connection",
161
+ "_connection",
162
+ "_driver",
163
+ "_driver_features",
164
+ "_prepare_driver",
165
+ "_release_connection",
166
+ "_statement_config",
167
+ )
168
+
169
+ def __init__(
170
+ self,
171
+ acquire_connection: "Callable[[], Any]",
172
+ release_connection: "Callable[[Any], Any]",
173
+ statement_config: "StatementConfig | Callable[[], StatementConfig]",
174
+ driver_features: "dict[str, Any]",
175
+ prepare_driver: "Callable[[PsycopgAsyncDriver], PsycopgAsyncDriver]",
176
+ ) -> None:
177
+ self._acquire_connection = acquire_connection
178
+ self._release_connection = release_connection
179
+ self._statement_config = statement_config
180
+ self._driver_features = driver_features
181
+ self._prepare_driver = prepare_driver
182
+ self._connection: Any = None
183
+ self._driver: PsycopgAsyncDriver | None = None
184
+
185
+ async def __aenter__(self) -> "PsycopgAsyncDriver":
186
+ from sqlspec.adapters.psycopg.driver import PsycopgAsyncDriver
187
+
188
+ self._connection = await self._acquire_connection()
189
+ statement_config = self._statement_config() if callable(self._statement_config) else self._statement_config
190
+ self._driver = PsycopgAsyncDriver(
191
+ connection=self._connection, statement_config=statement_config, driver_features=self._driver_features
192
+ )
193
+ return self._prepare_driver(self._driver)
194
+
195
+ async def __aexit__(
196
+ self, exc_type: "type[BaseException] | None", exc_val: "BaseException | None", exc_tb: "TracebackType | None"
197
+ ) -> "bool | None":
198
+ if self._connection is not None:
199
+ await self._release_connection(self._connection)
200
+ self._connection = None
201
+ return None
202
+
203
+
204
+ __all__ = (
205
+ "PsycopgAsyncConnection",
206
+ "PsycopgAsyncCursor",
207
+ "PsycopgAsyncRawCursor",
208
+ "PsycopgAsyncSessionContext",
209
+ "PsycopgComposed",
210
+ "PsycopgDictRow",
211
+ "PsycopgIdentifier",
212
+ "PsycopgPipelineDriver",
213
+ "PsycopgSQL",
214
+ "PsycopgSyncConnection",
215
+ "PsycopgSyncCursor",
216
+ "PsycopgSyncRawCursor",
217
+ "PsycopgSyncSessionContext",
218
+ )
@@ -0,0 +1,10 @@
1
+ """Psycopg ADK store module."""
2
+
3
+ from sqlspec.adapters.psycopg.adk.store import (
4
+ PsycopgAsyncADKMemoryStore,
5
+ PsycopgAsyncADKStore,
6
+ PsycopgSyncADKMemoryStore,
7
+ PsycopgSyncADKStore,
8
+ )
9
+
10
+ __all__ = ("PsycopgAsyncADKMemoryStore", "PsycopgAsyncADKStore", "PsycopgSyncADKMemoryStore", "PsycopgSyncADKStore")