SQLAlchemy 2.1.0b2__cp313-cp313t-win_arm64.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 (270) hide show
  1. sqlalchemy/__init__.py +298 -0
  2. sqlalchemy/connectors/__init__.py +18 -0
  3. sqlalchemy/connectors/aioodbc.py +171 -0
  4. sqlalchemy/connectors/asyncio.py +476 -0
  5. sqlalchemy/connectors/pyodbc.py +250 -0
  6. sqlalchemy/dialects/__init__.py +62 -0
  7. sqlalchemy/dialects/_typing.py +30 -0
  8. sqlalchemy/dialects/mssql/__init__.py +89 -0
  9. sqlalchemy/dialects/mssql/aioodbc.py +63 -0
  10. sqlalchemy/dialects/mssql/base.py +4166 -0
  11. sqlalchemy/dialects/mssql/information_schema.py +285 -0
  12. sqlalchemy/dialects/mssql/json.py +140 -0
  13. sqlalchemy/dialects/mssql/mssqlpython.py +220 -0
  14. sqlalchemy/dialects/mssql/provision.py +196 -0
  15. sqlalchemy/dialects/mssql/pymssql.py +126 -0
  16. sqlalchemy/dialects/mssql/pyodbc.py +698 -0
  17. sqlalchemy/dialects/mysql/__init__.py +106 -0
  18. sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
  19. sqlalchemy/dialects/mysql/aiomysql.py +226 -0
  20. sqlalchemy/dialects/mysql/asyncmy.py +214 -0
  21. sqlalchemy/dialects/mysql/base.py +3877 -0
  22. sqlalchemy/dialects/mysql/cymysql.py +106 -0
  23. sqlalchemy/dialects/mysql/dml.py +279 -0
  24. sqlalchemy/dialects/mysql/enumerated.py +277 -0
  25. sqlalchemy/dialects/mysql/expression.py +146 -0
  26. sqlalchemy/dialects/mysql/json.py +92 -0
  27. sqlalchemy/dialects/mysql/mariadb.py +67 -0
  28. sqlalchemy/dialects/mysql/mariadbconnector.py +330 -0
  29. sqlalchemy/dialects/mysql/mysqlconnector.py +296 -0
  30. sqlalchemy/dialects/mysql/mysqldb.py +312 -0
  31. sqlalchemy/dialects/mysql/provision.py +153 -0
  32. sqlalchemy/dialects/mysql/pymysql.py +157 -0
  33. sqlalchemy/dialects/mysql/pyodbc.py +156 -0
  34. sqlalchemy/dialects/mysql/reflection.py +724 -0
  35. sqlalchemy/dialects/mysql/reserved_words.py +570 -0
  36. sqlalchemy/dialects/mysql/types.py +845 -0
  37. sqlalchemy/dialects/oracle/__init__.py +85 -0
  38. sqlalchemy/dialects/oracle/base.py +3977 -0
  39. sqlalchemy/dialects/oracle/cx_oracle.py +1601 -0
  40. sqlalchemy/dialects/oracle/dictionary.py +507 -0
  41. sqlalchemy/dialects/oracle/json.py +158 -0
  42. sqlalchemy/dialects/oracle/oracledb.py +909 -0
  43. sqlalchemy/dialects/oracle/provision.py +288 -0
  44. sqlalchemy/dialects/oracle/types.py +367 -0
  45. sqlalchemy/dialects/oracle/vector.py +368 -0
  46. sqlalchemy/dialects/postgresql/__init__.py +171 -0
  47. sqlalchemy/dialects/postgresql/_psycopg_common.py +229 -0
  48. sqlalchemy/dialects/postgresql/array.py +534 -0
  49. sqlalchemy/dialects/postgresql/asyncpg.py +1323 -0
  50. sqlalchemy/dialects/postgresql/base.py +5789 -0
  51. sqlalchemy/dialects/postgresql/bitstring.py +327 -0
  52. sqlalchemy/dialects/postgresql/dml.py +360 -0
  53. sqlalchemy/dialects/postgresql/ext.py +593 -0
  54. sqlalchemy/dialects/postgresql/hstore.py +423 -0
  55. sqlalchemy/dialects/postgresql/json.py +408 -0
  56. sqlalchemy/dialects/postgresql/named_types.py +521 -0
  57. sqlalchemy/dialects/postgresql/operators.py +130 -0
  58. sqlalchemy/dialects/postgresql/pg8000.py +670 -0
  59. sqlalchemy/dialects/postgresql/pg_catalog.py +344 -0
  60. sqlalchemy/dialects/postgresql/provision.py +184 -0
  61. sqlalchemy/dialects/postgresql/psycopg.py +799 -0
  62. sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
  63. sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
  64. sqlalchemy/dialects/postgresql/ranges.py +1002 -0
  65. sqlalchemy/dialects/postgresql/types.py +388 -0
  66. sqlalchemy/dialects/sqlite/__init__.py +57 -0
  67. sqlalchemy/dialects/sqlite/aiosqlite.py +321 -0
  68. sqlalchemy/dialects/sqlite/base.py +3063 -0
  69. sqlalchemy/dialects/sqlite/dml.py +279 -0
  70. sqlalchemy/dialects/sqlite/json.py +100 -0
  71. sqlalchemy/dialects/sqlite/provision.py +229 -0
  72. sqlalchemy/dialects/sqlite/pysqlcipher.py +161 -0
  73. sqlalchemy/dialects/sqlite/pysqlite.py +754 -0
  74. sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
  75. sqlalchemy/engine/__init__.py +62 -0
  76. sqlalchemy/engine/_processors_cy.cp313t-win_arm64.pyd +0 -0
  77. sqlalchemy/engine/_processors_cy.py +92 -0
  78. sqlalchemy/engine/_result_cy.cp313t-win_arm64.pyd +0 -0
  79. sqlalchemy/engine/_result_cy.py +633 -0
  80. sqlalchemy/engine/_row_cy.cp313t-win_arm64.pyd +0 -0
  81. sqlalchemy/engine/_row_cy.py +232 -0
  82. sqlalchemy/engine/_util_cy.cp313t-win_arm64.pyd +0 -0
  83. sqlalchemy/engine/_util_cy.py +136 -0
  84. sqlalchemy/engine/base.py +3354 -0
  85. sqlalchemy/engine/characteristics.py +155 -0
  86. sqlalchemy/engine/create.py +877 -0
  87. sqlalchemy/engine/cursor.py +2421 -0
  88. sqlalchemy/engine/default.py +2402 -0
  89. sqlalchemy/engine/events.py +965 -0
  90. sqlalchemy/engine/interfaces.py +3495 -0
  91. sqlalchemy/engine/mock.py +134 -0
  92. sqlalchemy/engine/processors.py +82 -0
  93. sqlalchemy/engine/reflection.py +2100 -0
  94. sqlalchemy/engine/result.py +1966 -0
  95. sqlalchemy/engine/row.py +397 -0
  96. sqlalchemy/engine/strategies.py +16 -0
  97. sqlalchemy/engine/url.py +922 -0
  98. sqlalchemy/engine/util.py +156 -0
  99. sqlalchemy/event/__init__.py +26 -0
  100. sqlalchemy/event/api.py +220 -0
  101. sqlalchemy/event/attr.py +674 -0
  102. sqlalchemy/event/base.py +472 -0
  103. sqlalchemy/event/legacy.py +258 -0
  104. sqlalchemy/event/registry.py +390 -0
  105. sqlalchemy/events.py +17 -0
  106. sqlalchemy/exc.py +922 -0
  107. sqlalchemy/ext/__init__.py +11 -0
  108. sqlalchemy/ext/associationproxy.py +2072 -0
  109. sqlalchemy/ext/asyncio/__init__.py +29 -0
  110. sqlalchemy/ext/asyncio/base.py +281 -0
  111. sqlalchemy/ext/asyncio/engine.py +1487 -0
  112. sqlalchemy/ext/asyncio/exc.py +21 -0
  113. sqlalchemy/ext/asyncio/result.py +994 -0
  114. sqlalchemy/ext/asyncio/scoping.py +1679 -0
  115. sqlalchemy/ext/asyncio/session.py +2007 -0
  116. sqlalchemy/ext/automap.py +1701 -0
  117. sqlalchemy/ext/baked.py +559 -0
  118. sqlalchemy/ext/compiler.py +600 -0
  119. sqlalchemy/ext/declarative/__init__.py +65 -0
  120. sqlalchemy/ext/declarative/extensions.py +560 -0
  121. sqlalchemy/ext/horizontal_shard.py +481 -0
  122. sqlalchemy/ext/hybrid.py +1877 -0
  123. sqlalchemy/ext/indexable.py +364 -0
  124. sqlalchemy/ext/instrumentation.py +450 -0
  125. sqlalchemy/ext/mutable.py +1081 -0
  126. sqlalchemy/ext/orderinglist.py +439 -0
  127. sqlalchemy/ext/serializer.py +185 -0
  128. sqlalchemy/future/__init__.py +16 -0
  129. sqlalchemy/future/engine.py +15 -0
  130. sqlalchemy/inspection.py +174 -0
  131. sqlalchemy/log.py +283 -0
  132. sqlalchemy/orm/__init__.py +176 -0
  133. sqlalchemy/orm/_orm_constructors.py +2694 -0
  134. sqlalchemy/orm/_typing.py +179 -0
  135. sqlalchemy/orm/attributes.py +2868 -0
  136. sqlalchemy/orm/base.py +976 -0
  137. sqlalchemy/orm/bulk_persistence.py +2152 -0
  138. sqlalchemy/orm/clsregistry.py +582 -0
  139. sqlalchemy/orm/collections.py +1568 -0
  140. sqlalchemy/orm/context.py +3471 -0
  141. sqlalchemy/orm/decl_api.py +2280 -0
  142. sqlalchemy/orm/decl_base.py +2309 -0
  143. sqlalchemy/orm/dependency.py +1306 -0
  144. sqlalchemy/orm/descriptor_props.py +1183 -0
  145. sqlalchemy/orm/dynamic.py +307 -0
  146. sqlalchemy/orm/evaluator.py +379 -0
  147. sqlalchemy/orm/events.py +3386 -0
  148. sqlalchemy/orm/exc.py +237 -0
  149. sqlalchemy/orm/identity.py +302 -0
  150. sqlalchemy/orm/instrumentation.py +746 -0
  151. sqlalchemy/orm/interfaces.py +1589 -0
  152. sqlalchemy/orm/loading.py +1684 -0
  153. sqlalchemy/orm/mapped_collection.py +557 -0
  154. sqlalchemy/orm/mapper.py +4411 -0
  155. sqlalchemy/orm/path_registry.py +829 -0
  156. sqlalchemy/orm/persistence.py +1789 -0
  157. sqlalchemy/orm/properties.py +973 -0
  158. sqlalchemy/orm/query.py +3528 -0
  159. sqlalchemy/orm/relationships.py +3570 -0
  160. sqlalchemy/orm/scoping.py +2232 -0
  161. sqlalchemy/orm/session.py +5403 -0
  162. sqlalchemy/orm/state.py +1175 -0
  163. sqlalchemy/orm/state_changes.py +196 -0
  164. sqlalchemy/orm/strategies.py +3492 -0
  165. sqlalchemy/orm/strategy_options.py +2562 -0
  166. sqlalchemy/orm/sync.py +164 -0
  167. sqlalchemy/orm/unitofwork.py +798 -0
  168. sqlalchemy/orm/util.py +2438 -0
  169. sqlalchemy/orm/writeonly.py +694 -0
  170. sqlalchemy/pool/__init__.py +41 -0
  171. sqlalchemy/pool/base.py +1522 -0
  172. sqlalchemy/pool/events.py +375 -0
  173. sqlalchemy/pool/impl.py +582 -0
  174. sqlalchemy/py.typed +0 -0
  175. sqlalchemy/schema.py +74 -0
  176. sqlalchemy/sql/__init__.py +156 -0
  177. sqlalchemy/sql/_annotated_cols.py +397 -0
  178. sqlalchemy/sql/_dml_constructors.py +132 -0
  179. sqlalchemy/sql/_elements_constructors.py +2164 -0
  180. sqlalchemy/sql/_orm_types.py +20 -0
  181. sqlalchemy/sql/_selectable_constructors.py +840 -0
  182. sqlalchemy/sql/_typing.py +487 -0
  183. sqlalchemy/sql/_util_cy.cp313t-win_arm64.pyd +0 -0
  184. sqlalchemy/sql/_util_cy.py +127 -0
  185. sqlalchemy/sql/annotation.py +590 -0
  186. sqlalchemy/sql/base.py +2699 -0
  187. sqlalchemy/sql/cache_key.py +1066 -0
  188. sqlalchemy/sql/coercions.py +1373 -0
  189. sqlalchemy/sql/compiler.py +8327 -0
  190. sqlalchemy/sql/crud.py +1815 -0
  191. sqlalchemy/sql/ddl.py +1928 -0
  192. sqlalchemy/sql/default_comparator.py +654 -0
  193. sqlalchemy/sql/dml.py +1977 -0
  194. sqlalchemy/sql/elements.py +6033 -0
  195. sqlalchemy/sql/events.py +458 -0
  196. sqlalchemy/sql/expression.py +172 -0
  197. sqlalchemy/sql/functions.py +2305 -0
  198. sqlalchemy/sql/lambdas.py +1443 -0
  199. sqlalchemy/sql/naming.py +209 -0
  200. sqlalchemy/sql/operators.py +2897 -0
  201. sqlalchemy/sql/roles.py +332 -0
  202. sqlalchemy/sql/schema.py +6703 -0
  203. sqlalchemy/sql/selectable.py +7553 -0
  204. sqlalchemy/sql/sqltypes.py +4093 -0
  205. sqlalchemy/sql/traversals.py +1042 -0
  206. sqlalchemy/sql/type_api.py +2446 -0
  207. sqlalchemy/sql/util.py +1495 -0
  208. sqlalchemy/sql/visitors.py +1157 -0
  209. sqlalchemy/testing/__init__.py +96 -0
  210. sqlalchemy/testing/assertions.py +1007 -0
  211. sqlalchemy/testing/assertsql.py +519 -0
  212. sqlalchemy/testing/asyncio.py +128 -0
  213. sqlalchemy/testing/config.py +440 -0
  214. sqlalchemy/testing/engines.py +483 -0
  215. sqlalchemy/testing/entities.py +117 -0
  216. sqlalchemy/testing/exclusions.py +476 -0
  217. sqlalchemy/testing/fixtures/__init__.py +30 -0
  218. sqlalchemy/testing/fixtures/base.py +384 -0
  219. sqlalchemy/testing/fixtures/mypy.py +247 -0
  220. sqlalchemy/testing/fixtures/orm.py +227 -0
  221. sqlalchemy/testing/fixtures/sql.py +538 -0
  222. sqlalchemy/testing/pickleable.py +155 -0
  223. sqlalchemy/testing/plugin/__init__.py +6 -0
  224. sqlalchemy/testing/plugin/bootstrap.py +51 -0
  225. sqlalchemy/testing/plugin/plugin_base.py +828 -0
  226. sqlalchemy/testing/plugin/pytestplugin.py +892 -0
  227. sqlalchemy/testing/profiling.py +329 -0
  228. sqlalchemy/testing/provision.py +613 -0
  229. sqlalchemy/testing/requirements.py +1978 -0
  230. sqlalchemy/testing/schema.py +198 -0
  231. sqlalchemy/testing/suite/__init__.py +19 -0
  232. sqlalchemy/testing/suite/test_cte.py +237 -0
  233. sqlalchemy/testing/suite/test_ddl.py +420 -0
  234. sqlalchemy/testing/suite/test_dialect.py +776 -0
  235. sqlalchemy/testing/suite/test_insert.py +630 -0
  236. sqlalchemy/testing/suite/test_reflection.py +3557 -0
  237. sqlalchemy/testing/suite/test_results.py +660 -0
  238. sqlalchemy/testing/suite/test_rowcount.py +258 -0
  239. sqlalchemy/testing/suite/test_select.py +2112 -0
  240. sqlalchemy/testing/suite/test_sequence.py +317 -0
  241. sqlalchemy/testing/suite/test_table_via_select.py +686 -0
  242. sqlalchemy/testing/suite/test_types.py +2271 -0
  243. sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
  244. sqlalchemy/testing/suite/test_update_delete.py +139 -0
  245. sqlalchemy/testing/util.py +535 -0
  246. sqlalchemy/testing/warnings.py +52 -0
  247. sqlalchemy/types.py +76 -0
  248. sqlalchemy/util/__init__.py +158 -0
  249. sqlalchemy/util/_collections.py +688 -0
  250. sqlalchemy/util/_collections_cy.cp313t-win_arm64.pyd +0 -0
  251. sqlalchemy/util/_collections_cy.pxd +8 -0
  252. sqlalchemy/util/_collections_cy.py +516 -0
  253. sqlalchemy/util/_has_cython.py +46 -0
  254. sqlalchemy/util/_immutabledict_cy.cp313t-win_arm64.pyd +0 -0
  255. sqlalchemy/util/_immutabledict_cy.py +240 -0
  256. sqlalchemy/util/compat.py +299 -0
  257. sqlalchemy/util/concurrency.py +322 -0
  258. sqlalchemy/util/cython.py +79 -0
  259. sqlalchemy/util/deprecations.py +401 -0
  260. sqlalchemy/util/langhelpers.py +2320 -0
  261. sqlalchemy/util/preloaded.py +152 -0
  262. sqlalchemy/util/queue.py +304 -0
  263. sqlalchemy/util/tool_support.py +201 -0
  264. sqlalchemy/util/topological.py +120 -0
  265. sqlalchemy/util/typing.py +711 -0
  266. sqlalchemy-2.1.0b2.dist-info/METADATA +269 -0
  267. sqlalchemy-2.1.0b2.dist-info/RECORD +270 -0
  268. sqlalchemy-2.1.0b2.dist-info/WHEEL +5 -0
  269. sqlalchemy-2.1.0b2.dist-info/licenses/LICENSE +19 -0
  270. sqlalchemy-2.1.0b2.dist-info/top_level.txt +1 -0
@@ -0,0 +1,229 @@
1
+ # dialects/postgresql/_psycopg_common.py
2
+ # Copyright (C) 2005-2026 the SQLAlchemy authors and contributors
3
+ # <see AUTHORS file>
4
+ #
5
+ # This module is part of SQLAlchemy and is released under
6
+ # the MIT License: https://www.opensource.org/licenses/mit-license.php
7
+ # mypy: ignore-errors
8
+ from __future__ import annotations
9
+
10
+ import decimal
11
+
12
+ from .array import ARRAY as PGARRAY
13
+ from .base import _DECIMAL_TYPES
14
+ from .base import _FLOAT_TYPES
15
+ from .base import _INT_TYPES
16
+ from .base import PGDialect
17
+ from .base import PGExecutionContext
18
+ from .hstore import HSTORE
19
+ from .pg_catalog import _SpaceVector
20
+ from .pg_catalog import INT2VECTOR
21
+ from .pg_catalog import OIDVECTOR
22
+ from ... import exc
23
+ from ... import types as sqltypes
24
+ from ... import util
25
+ from ...engine import processors
26
+
27
+ _server_side_id = util.counter()
28
+
29
+
30
+ class _PsycopgNumericCommon(sqltypes.NumericCommon):
31
+ def bind_processor(self, dialect):
32
+ return None
33
+
34
+ def result_processor(self, dialect, coltype):
35
+ if self.asdecimal:
36
+ if coltype in _FLOAT_TYPES:
37
+ return processors.to_decimal_processor_factory(
38
+ decimal.Decimal, self._effective_decimal_return_scale
39
+ )
40
+ elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES:
41
+ # psycopg returns Decimal natively for 1700
42
+ return None
43
+ else:
44
+ raise exc.InvalidRequestError(
45
+ "Unknown PG numeric type: %d" % coltype
46
+ )
47
+ else:
48
+ if coltype in _FLOAT_TYPES:
49
+ # psycopg returns float natively for 701
50
+ return None
51
+ elif coltype in _DECIMAL_TYPES or coltype in _INT_TYPES:
52
+ return processors.to_float
53
+ else:
54
+ raise exc.InvalidRequestError(
55
+ "Unknown PG numeric type: %d" % coltype
56
+ )
57
+
58
+
59
+ class _PsycopgNumeric(_PsycopgNumericCommon, sqltypes.Numeric):
60
+ pass
61
+
62
+
63
+ class _PsycopgFloat(_PsycopgNumericCommon, sqltypes.Float):
64
+ pass
65
+
66
+
67
+ class _PsycopgHStore(HSTORE):
68
+ def bind_processor(self, dialect):
69
+ if dialect._has_native_hstore:
70
+ return None
71
+ else:
72
+ return super().bind_processor(dialect)
73
+
74
+ def result_processor(self, dialect, coltype):
75
+ if dialect._has_native_hstore:
76
+ return None
77
+ else:
78
+ return super().result_processor(dialect, coltype)
79
+
80
+
81
+ class _PsycopgARRAY(PGARRAY):
82
+ render_bind_cast = True
83
+
84
+
85
+ class _PsycopgINT2VECTOR(_SpaceVector, INT2VECTOR):
86
+ pass
87
+
88
+
89
+ class _PsycopgOIDVECTOR(_SpaceVector, OIDVECTOR):
90
+ pass
91
+
92
+
93
+ class _PGExecutionContext_common_psycopg(PGExecutionContext):
94
+ def create_server_side_cursor(self):
95
+ # use server-side cursors:
96
+ # psycopg
97
+ # https://www.psycopg.org/psycopg3/docs/advanced/cursors.html#server-side-cursors
98
+ # psycopg2
99
+ # https://www.psycopg.org/docs/usage.html#server-side-cursors
100
+ ident = "c_%s_%s" % (hex(id(self))[2:], hex(_server_side_id())[2:])
101
+ return self._dbapi_connection.cursor(ident)
102
+
103
+
104
+ class _PGDialect_common_psycopg(PGDialect):
105
+ supports_statement_cache = True
106
+ supports_server_side_cursors = True
107
+
108
+ default_paramstyle = "pyformat"
109
+
110
+ _has_native_hstore = True
111
+
112
+ colspecs = util.update_copy(
113
+ PGDialect.colspecs,
114
+ {
115
+ sqltypes.Numeric: _PsycopgNumeric,
116
+ sqltypes.Float: _PsycopgFloat,
117
+ HSTORE: _PsycopgHStore,
118
+ sqltypes.ARRAY: _PsycopgARRAY,
119
+ INT2VECTOR: _PsycopgINT2VECTOR,
120
+ OIDVECTOR: _PsycopgOIDVECTOR,
121
+ },
122
+ )
123
+
124
+ def __init__(
125
+ self,
126
+ client_encoding=None,
127
+ use_native_hstore=True,
128
+ **kwargs,
129
+ ):
130
+ PGDialect.__init__(self, **kwargs)
131
+ if not use_native_hstore:
132
+ self._has_native_hstore = False
133
+ self.use_native_hstore = use_native_hstore
134
+ self.client_encoding = client_encoding
135
+
136
+ def create_connect_args(self, url):
137
+ opts = url.translate_connect_args(username="user", database="dbname")
138
+
139
+ multihosts, multiports = self._split_multihost_from_url(url)
140
+
141
+ if opts or url.query:
142
+ if not opts:
143
+ opts = {}
144
+ if "port" in opts:
145
+ opts["port"] = int(opts["port"])
146
+ opts.update(url.query)
147
+
148
+ if multihosts:
149
+ opts["host"] = ",".join(multihosts)
150
+ comma_ports = ",".join(str(p) if p else "" for p in multiports)
151
+ if comma_ports:
152
+ opts["port"] = comma_ports
153
+ return ([], opts)
154
+ else:
155
+ # no connection arguments whatsoever; psycopg2.connect()
156
+ # requires that "dsn" be present as a blank string.
157
+ return ([""], opts)
158
+
159
+ def get_isolation_level_values(self, dbapi_connection):
160
+ return (
161
+ "AUTOCOMMIT",
162
+ "READ COMMITTED",
163
+ "READ UNCOMMITTED",
164
+ "REPEATABLE READ",
165
+ "SERIALIZABLE",
166
+ )
167
+
168
+ def set_deferrable(self, connection, value):
169
+ connection.deferrable = value
170
+
171
+ def get_deferrable(self, connection):
172
+ return connection.deferrable
173
+
174
+ def _do_autocommit(self, connection, value):
175
+ connection.autocommit = value
176
+
177
+ def detect_autocommit_setting(self, dbapi_connection):
178
+ return bool(dbapi_connection.autocommit)
179
+
180
+ def do_ping(self, dbapi_connection):
181
+ before_autocommit = dbapi_connection.autocommit
182
+
183
+ if not before_autocommit:
184
+ dbapi_connection.autocommit = True
185
+ cursor = dbapi_connection.cursor()
186
+ try:
187
+ cursor.execute(self._dialect_specific_select_one)
188
+ finally:
189
+ cursor.close()
190
+ if not before_autocommit and not dbapi_connection.closed:
191
+ dbapi_connection.autocommit = before_autocommit
192
+
193
+ return True
194
+
195
+ def do_begin_twophase(self, connection, xid):
196
+ connection.connection.tpc_begin(xid)
197
+
198
+ def do_prepare_twophase(self, connection, xid):
199
+ connection.connection.tpc_prepare()
200
+
201
+ def _do_twophase(self, dbapi_conn, operation, xid, recover=False):
202
+ if recover:
203
+ if not self._twophase_idle_check(dbapi_conn):
204
+ dbapi_conn.rollback()
205
+ operation(xid)
206
+ else:
207
+ operation()
208
+
209
+ def _twophase_idle_check(self, dbapi_conn):
210
+ raise NotImplementedError
211
+
212
+ def do_rollback_twophase(
213
+ self, connection, xid, is_prepared=True, recover=False
214
+ ):
215
+ dbapi_conn = connection.connection.dbapi_connection
216
+ self._do_twophase(
217
+ dbapi_conn, dbapi_conn.tpc_rollback, xid, recover=recover
218
+ )
219
+
220
+ def do_commit_twophase(
221
+ self, connection, xid, is_prepared=True, recover=False
222
+ ):
223
+ dbapi_conn = connection.connection.dbapi_connection
224
+ self._do_twophase(
225
+ dbapi_conn, dbapi_conn.tpc_commit, xid, recover=recover
226
+ )
227
+
228
+ def do_recover_twophase(self, connection):
229
+ return [row[1] for row in connection.connection.tpc_recover()]