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.
- sqlalchemy/__init__.py +298 -0
- sqlalchemy/connectors/__init__.py +18 -0
- sqlalchemy/connectors/aioodbc.py +171 -0
- sqlalchemy/connectors/asyncio.py +476 -0
- sqlalchemy/connectors/pyodbc.py +250 -0
- sqlalchemy/dialects/__init__.py +62 -0
- sqlalchemy/dialects/_typing.py +30 -0
- sqlalchemy/dialects/mssql/__init__.py +89 -0
- sqlalchemy/dialects/mssql/aioodbc.py +63 -0
- sqlalchemy/dialects/mssql/base.py +4166 -0
- sqlalchemy/dialects/mssql/information_schema.py +285 -0
- sqlalchemy/dialects/mssql/json.py +140 -0
- sqlalchemy/dialects/mssql/mssqlpython.py +220 -0
- sqlalchemy/dialects/mssql/provision.py +196 -0
- sqlalchemy/dialects/mssql/pymssql.py +126 -0
- sqlalchemy/dialects/mssql/pyodbc.py +698 -0
- sqlalchemy/dialects/mysql/__init__.py +106 -0
- sqlalchemy/dialects/mysql/_mariadb_shim.py +312 -0
- sqlalchemy/dialects/mysql/aiomysql.py +226 -0
- sqlalchemy/dialects/mysql/asyncmy.py +214 -0
- sqlalchemy/dialects/mysql/base.py +3877 -0
- sqlalchemy/dialects/mysql/cymysql.py +106 -0
- sqlalchemy/dialects/mysql/dml.py +279 -0
- sqlalchemy/dialects/mysql/enumerated.py +277 -0
- sqlalchemy/dialects/mysql/expression.py +146 -0
- sqlalchemy/dialects/mysql/json.py +92 -0
- sqlalchemy/dialects/mysql/mariadb.py +67 -0
- sqlalchemy/dialects/mysql/mariadbconnector.py +330 -0
- sqlalchemy/dialects/mysql/mysqlconnector.py +296 -0
- sqlalchemy/dialects/mysql/mysqldb.py +312 -0
- sqlalchemy/dialects/mysql/provision.py +153 -0
- sqlalchemy/dialects/mysql/pymysql.py +157 -0
- sqlalchemy/dialects/mysql/pyodbc.py +156 -0
- sqlalchemy/dialects/mysql/reflection.py +724 -0
- sqlalchemy/dialects/mysql/reserved_words.py +570 -0
- sqlalchemy/dialects/mysql/types.py +845 -0
- sqlalchemy/dialects/oracle/__init__.py +85 -0
- sqlalchemy/dialects/oracle/base.py +3977 -0
- sqlalchemy/dialects/oracle/cx_oracle.py +1601 -0
- sqlalchemy/dialects/oracle/dictionary.py +507 -0
- sqlalchemy/dialects/oracle/json.py +158 -0
- sqlalchemy/dialects/oracle/oracledb.py +909 -0
- sqlalchemy/dialects/oracle/provision.py +288 -0
- sqlalchemy/dialects/oracle/types.py +367 -0
- sqlalchemy/dialects/oracle/vector.py +368 -0
- sqlalchemy/dialects/postgresql/__init__.py +171 -0
- sqlalchemy/dialects/postgresql/_psycopg_common.py +229 -0
- sqlalchemy/dialects/postgresql/array.py +534 -0
- sqlalchemy/dialects/postgresql/asyncpg.py +1323 -0
- sqlalchemy/dialects/postgresql/base.py +5789 -0
- sqlalchemy/dialects/postgresql/bitstring.py +327 -0
- sqlalchemy/dialects/postgresql/dml.py +360 -0
- sqlalchemy/dialects/postgresql/ext.py +593 -0
- sqlalchemy/dialects/postgresql/hstore.py +423 -0
- sqlalchemy/dialects/postgresql/json.py +408 -0
- sqlalchemy/dialects/postgresql/named_types.py +521 -0
- sqlalchemy/dialects/postgresql/operators.py +130 -0
- sqlalchemy/dialects/postgresql/pg8000.py +670 -0
- sqlalchemy/dialects/postgresql/pg_catalog.py +344 -0
- sqlalchemy/dialects/postgresql/provision.py +184 -0
- sqlalchemy/dialects/postgresql/psycopg.py +799 -0
- sqlalchemy/dialects/postgresql/psycopg2.py +860 -0
- sqlalchemy/dialects/postgresql/psycopg2cffi.py +61 -0
- sqlalchemy/dialects/postgresql/ranges.py +1002 -0
- sqlalchemy/dialects/postgresql/types.py +388 -0
- sqlalchemy/dialects/sqlite/__init__.py +57 -0
- sqlalchemy/dialects/sqlite/aiosqlite.py +321 -0
- sqlalchemy/dialects/sqlite/base.py +3063 -0
- sqlalchemy/dialects/sqlite/dml.py +279 -0
- sqlalchemy/dialects/sqlite/json.py +100 -0
- sqlalchemy/dialects/sqlite/provision.py +229 -0
- sqlalchemy/dialects/sqlite/pysqlcipher.py +161 -0
- sqlalchemy/dialects/sqlite/pysqlite.py +754 -0
- sqlalchemy/dialects/type_migration_guidelines.txt +145 -0
- sqlalchemy/engine/__init__.py +62 -0
- sqlalchemy/engine/_processors_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_processors_cy.py +92 -0
- sqlalchemy/engine/_result_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_result_cy.py +633 -0
- sqlalchemy/engine/_row_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_row_cy.py +232 -0
- sqlalchemy/engine/_util_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/engine/_util_cy.py +136 -0
- sqlalchemy/engine/base.py +3354 -0
- sqlalchemy/engine/characteristics.py +155 -0
- sqlalchemy/engine/create.py +877 -0
- sqlalchemy/engine/cursor.py +2421 -0
- sqlalchemy/engine/default.py +2402 -0
- sqlalchemy/engine/events.py +965 -0
- sqlalchemy/engine/interfaces.py +3495 -0
- sqlalchemy/engine/mock.py +134 -0
- sqlalchemy/engine/processors.py +82 -0
- sqlalchemy/engine/reflection.py +2100 -0
- sqlalchemy/engine/result.py +1966 -0
- sqlalchemy/engine/row.py +397 -0
- sqlalchemy/engine/strategies.py +16 -0
- sqlalchemy/engine/url.py +922 -0
- sqlalchemy/engine/util.py +156 -0
- sqlalchemy/event/__init__.py +26 -0
- sqlalchemy/event/api.py +220 -0
- sqlalchemy/event/attr.py +674 -0
- sqlalchemy/event/base.py +472 -0
- sqlalchemy/event/legacy.py +258 -0
- sqlalchemy/event/registry.py +390 -0
- sqlalchemy/events.py +17 -0
- sqlalchemy/exc.py +922 -0
- sqlalchemy/ext/__init__.py +11 -0
- sqlalchemy/ext/associationproxy.py +2072 -0
- sqlalchemy/ext/asyncio/__init__.py +29 -0
- sqlalchemy/ext/asyncio/base.py +281 -0
- sqlalchemy/ext/asyncio/engine.py +1487 -0
- sqlalchemy/ext/asyncio/exc.py +21 -0
- sqlalchemy/ext/asyncio/result.py +994 -0
- sqlalchemy/ext/asyncio/scoping.py +1679 -0
- sqlalchemy/ext/asyncio/session.py +2007 -0
- sqlalchemy/ext/automap.py +1701 -0
- sqlalchemy/ext/baked.py +559 -0
- sqlalchemy/ext/compiler.py +600 -0
- sqlalchemy/ext/declarative/__init__.py +65 -0
- sqlalchemy/ext/declarative/extensions.py +560 -0
- sqlalchemy/ext/horizontal_shard.py +481 -0
- sqlalchemy/ext/hybrid.py +1877 -0
- sqlalchemy/ext/indexable.py +364 -0
- sqlalchemy/ext/instrumentation.py +450 -0
- sqlalchemy/ext/mutable.py +1081 -0
- sqlalchemy/ext/orderinglist.py +439 -0
- sqlalchemy/ext/serializer.py +185 -0
- sqlalchemy/future/__init__.py +16 -0
- sqlalchemy/future/engine.py +15 -0
- sqlalchemy/inspection.py +174 -0
- sqlalchemy/log.py +283 -0
- sqlalchemy/orm/__init__.py +176 -0
- sqlalchemy/orm/_orm_constructors.py +2694 -0
- sqlalchemy/orm/_typing.py +179 -0
- sqlalchemy/orm/attributes.py +2868 -0
- sqlalchemy/orm/base.py +976 -0
- sqlalchemy/orm/bulk_persistence.py +2152 -0
- sqlalchemy/orm/clsregistry.py +582 -0
- sqlalchemy/orm/collections.py +1568 -0
- sqlalchemy/orm/context.py +3471 -0
- sqlalchemy/orm/decl_api.py +2280 -0
- sqlalchemy/orm/decl_base.py +2309 -0
- sqlalchemy/orm/dependency.py +1306 -0
- sqlalchemy/orm/descriptor_props.py +1183 -0
- sqlalchemy/orm/dynamic.py +307 -0
- sqlalchemy/orm/evaluator.py +379 -0
- sqlalchemy/orm/events.py +3386 -0
- sqlalchemy/orm/exc.py +237 -0
- sqlalchemy/orm/identity.py +302 -0
- sqlalchemy/orm/instrumentation.py +746 -0
- sqlalchemy/orm/interfaces.py +1589 -0
- sqlalchemy/orm/loading.py +1684 -0
- sqlalchemy/orm/mapped_collection.py +557 -0
- sqlalchemy/orm/mapper.py +4411 -0
- sqlalchemy/orm/path_registry.py +829 -0
- sqlalchemy/orm/persistence.py +1789 -0
- sqlalchemy/orm/properties.py +973 -0
- sqlalchemy/orm/query.py +3528 -0
- sqlalchemy/orm/relationships.py +3570 -0
- sqlalchemy/orm/scoping.py +2232 -0
- sqlalchemy/orm/session.py +5403 -0
- sqlalchemy/orm/state.py +1175 -0
- sqlalchemy/orm/state_changes.py +196 -0
- sqlalchemy/orm/strategies.py +3492 -0
- sqlalchemy/orm/strategy_options.py +2562 -0
- sqlalchemy/orm/sync.py +164 -0
- sqlalchemy/orm/unitofwork.py +798 -0
- sqlalchemy/orm/util.py +2438 -0
- sqlalchemy/orm/writeonly.py +694 -0
- sqlalchemy/pool/__init__.py +41 -0
- sqlalchemy/pool/base.py +1522 -0
- sqlalchemy/pool/events.py +375 -0
- sqlalchemy/pool/impl.py +582 -0
- sqlalchemy/py.typed +0 -0
- sqlalchemy/schema.py +74 -0
- sqlalchemy/sql/__init__.py +156 -0
- sqlalchemy/sql/_annotated_cols.py +397 -0
- sqlalchemy/sql/_dml_constructors.py +132 -0
- sqlalchemy/sql/_elements_constructors.py +2164 -0
- sqlalchemy/sql/_orm_types.py +20 -0
- sqlalchemy/sql/_selectable_constructors.py +840 -0
- sqlalchemy/sql/_typing.py +487 -0
- sqlalchemy/sql/_util_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/sql/_util_cy.py +127 -0
- sqlalchemy/sql/annotation.py +590 -0
- sqlalchemy/sql/base.py +2699 -0
- sqlalchemy/sql/cache_key.py +1066 -0
- sqlalchemy/sql/coercions.py +1373 -0
- sqlalchemy/sql/compiler.py +8327 -0
- sqlalchemy/sql/crud.py +1815 -0
- sqlalchemy/sql/ddl.py +1928 -0
- sqlalchemy/sql/default_comparator.py +654 -0
- sqlalchemy/sql/dml.py +1977 -0
- sqlalchemy/sql/elements.py +6033 -0
- sqlalchemy/sql/events.py +458 -0
- sqlalchemy/sql/expression.py +172 -0
- sqlalchemy/sql/functions.py +2305 -0
- sqlalchemy/sql/lambdas.py +1443 -0
- sqlalchemy/sql/naming.py +209 -0
- sqlalchemy/sql/operators.py +2897 -0
- sqlalchemy/sql/roles.py +332 -0
- sqlalchemy/sql/schema.py +6703 -0
- sqlalchemy/sql/selectable.py +7553 -0
- sqlalchemy/sql/sqltypes.py +4093 -0
- sqlalchemy/sql/traversals.py +1042 -0
- sqlalchemy/sql/type_api.py +2446 -0
- sqlalchemy/sql/util.py +1495 -0
- sqlalchemy/sql/visitors.py +1157 -0
- sqlalchemy/testing/__init__.py +96 -0
- sqlalchemy/testing/assertions.py +1007 -0
- sqlalchemy/testing/assertsql.py +519 -0
- sqlalchemy/testing/asyncio.py +128 -0
- sqlalchemy/testing/config.py +440 -0
- sqlalchemy/testing/engines.py +483 -0
- sqlalchemy/testing/entities.py +117 -0
- sqlalchemy/testing/exclusions.py +476 -0
- sqlalchemy/testing/fixtures/__init__.py +30 -0
- sqlalchemy/testing/fixtures/base.py +384 -0
- sqlalchemy/testing/fixtures/mypy.py +247 -0
- sqlalchemy/testing/fixtures/orm.py +227 -0
- sqlalchemy/testing/fixtures/sql.py +538 -0
- sqlalchemy/testing/pickleable.py +155 -0
- sqlalchemy/testing/plugin/__init__.py +6 -0
- sqlalchemy/testing/plugin/bootstrap.py +51 -0
- sqlalchemy/testing/plugin/plugin_base.py +828 -0
- sqlalchemy/testing/plugin/pytestplugin.py +892 -0
- sqlalchemy/testing/profiling.py +329 -0
- sqlalchemy/testing/provision.py +613 -0
- sqlalchemy/testing/requirements.py +1978 -0
- sqlalchemy/testing/schema.py +198 -0
- sqlalchemy/testing/suite/__init__.py +19 -0
- sqlalchemy/testing/suite/test_cte.py +237 -0
- sqlalchemy/testing/suite/test_ddl.py +420 -0
- sqlalchemy/testing/suite/test_dialect.py +776 -0
- sqlalchemy/testing/suite/test_insert.py +630 -0
- sqlalchemy/testing/suite/test_reflection.py +3557 -0
- sqlalchemy/testing/suite/test_results.py +660 -0
- sqlalchemy/testing/suite/test_rowcount.py +258 -0
- sqlalchemy/testing/suite/test_select.py +2112 -0
- sqlalchemy/testing/suite/test_sequence.py +317 -0
- sqlalchemy/testing/suite/test_table_via_select.py +686 -0
- sqlalchemy/testing/suite/test_types.py +2271 -0
- sqlalchemy/testing/suite/test_unicode_ddl.py +189 -0
- sqlalchemy/testing/suite/test_update_delete.py +139 -0
- sqlalchemy/testing/util.py +535 -0
- sqlalchemy/testing/warnings.py +52 -0
- sqlalchemy/types.py +76 -0
- sqlalchemy/util/__init__.py +158 -0
- sqlalchemy/util/_collections.py +688 -0
- sqlalchemy/util/_collections_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/util/_collections_cy.pxd +8 -0
- sqlalchemy/util/_collections_cy.py +516 -0
- sqlalchemy/util/_has_cython.py +46 -0
- sqlalchemy/util/_immutabledict_cy.cp313t-win_arm64.pyd +0 -0
- sqlalchemy/util/_immutabledict_cy.py +240 -0
- sqlalchemy/util/compat.py +299 -0
- sqlalchemy/util/concurrency.py +322 -0
- sqlalchemy/util/cython.py +79 -0
- sqlalchemy/util/deprecations.py +401 -0
- sqlalchemy/util/langhelpers.py +2320 -0
- sqlalchemy/util/preloaded.py +152 -0
- sqlalchemy/util/queue.py +304 -0
- sqlalchemy/util/tool_support.py +201 -0
- sqlalchemy/util/topological.py +120 -0
- sqlalchemy/util/typing.py +711 -0
- sqlalchemy-2.1.0b2.dist-info/METADATA +269 -0
- sqlalchemy-2.1.0b2.dist-info/RECORD +270 -0
- sqlalchemy-2.1.0b2.dist-info/WHEEL +5 -0
- sqlalchemy-2.1.0b2.dist-info/licenses/LICENSE +19 -0
- 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()]
|