mssql-python 1.16.0__cp315-cp315-macosx_15_0_universal2.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.
- mssql_python/__init__.py +662 -0
- mssql_python/async_query/__init__.py +40 -0
- mssql_python/async_query/_connection_context.py +39 -0
- mssql_python/async_query/_native.py +23 -0
- mssql_python/async_query/async_connection.py +160 -0
- mssql_python/async_query/async_cursor.py +230 -0
- mssql_python/async_query/async_execute.py +115 -0
- mssql_python/async_query/async_fetch.py +134 -0
- mssql_python/async_query/exception_translator.py +114 -0
- mssql_python/auth.py +913 -0
- mssql_python/connection.py +2357 -0
- mssql_python/connection_string_builder.py +114 -0
- mssql_python/connection_string_parser.py +424 -0
- mssql_python/constants.py +701 -0
- mssql_python/cursor.py +4188 -0
- mssql_python/db_connection.py +98 -0
- mssql_python/ddbc_bindings.cp315-universal2.so +0 -0
- mssql_python/ddbc_bindings.py +215 -0
- mssql_python/decimal_config.py +114 -0
- mssql_python/exceptions.py +588 -0
- mssql_python/helpers.py +416 -0
- mssql_python/logging.py +714 -0
- mssql_python/mssql_python.pyi +481 -0
- mssql_python/odbc_provider.py +251 -0
- mssql_python/parameter_helper.py +488 -0
- mssql_python/perf_timer.py +286 -0
- mssql_python/pooling.py +151 -0
- mssql_python/py.typed +1 -0
- mssql_python/row.py +398 -0
- mssql_python/type.py +160 -0
- mssql_python-1.16.0.dist-info/METADATA +102 -0
- mssql_python-1.16.0.dist-info/RECORD +35 -0
- mssql_python-1.16.0.dist-info/WHEEL +5 -0
- mssql_python-1.16.0.dist-info/licenses/LICENSE +47 -0
- mssql_python-1.16.0.dist-info/top_level.txt +1 -0
mssql_python/__init__.py
ADDED
|
@@ -0,0 +1,662 @@
|
|
|
1
|
+
"""
|
|
2
|
+
Copyright (c) Microsoft Corporation.
|
|
3
|
+
Licensed under the MIT license.
|
|
4
|
+
This module initializes the mssql_python package.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
import atexit
|
|
8
|
+
import sys
|
|
9
|
+
import threading
|
|
10
|
+
import types
|
|
11
|
+
import weakref
|
|
12
|
+
from typing import Optional
|
|
13
|
+
|
|
14
|
+
# Import settings from helpers module
|
|
15
|
+
from .helpers import Settings, get_settings, _settings, _settings_lock
|
|
16
|
+
|
|
17
|
+
# Driver version
|
|
18
|
+
__version__ = "1.16.0"
|
|
19
|
+
|
|
20
|
+
# Exceptions
|
|
21
|
+
# https://www.python.org/dev/peps/pep-0249/#exceptions
|
|
22
|
+
|
|
23
|
+
# Import necessary modules
|
|
24
|
+
from .exceptions import (
|
|
25
|
+
Warning,
|
|
26
|
+
Error,
|
|
27
|
+
InterfaceError,
|
|
28
|
+
DatabaseError,
|
|
29
|
+
DataError,
|
|
30
|
+
OperationalError,
|
|
31
|
+
IntegrityError,
|
|
32
|
+
InternalError,
|
|
33
|
+
ProgrammingError,
|
|
34
|
+
NotSupportedError,
|
|
35
|
+
ConnectionStringParseError,
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
# Type Objects
|
|
39
|
+
from .type import (
|
|
40
|
+
Date,
|
|
41
|
+
Time,
|
|
42
|
+
Timestamp,
|
|
43
|
+
DateFromTicks,
|
|
44
|
+
TimeFromTicks,
|
|
45
|
+
TimestampFromTicks,
|
|
46
|
+
Binary,
|
|
47
|
+
STRING,
|
|
48
|
+
BINARY,
|
|
49
|
+
NUMBER,
|
|
50
|
+
DATETIME,
|
|
51
|
+
ROWID,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
# Connection Objects
|
|
55
|
+
from .db_connection import connect, Connection
|
|
56
|
+
|
|
57
|
+
# Token provider protocol (structural type for the token_provider= parameter)
|
|
58
|
+
from .connection import TokenProvider
|
|
59
|
+
|
|
60
|
+
# Connection String Handling
|
|
61
|
+
from .connection_string_parser import _ConnectionStringParser
|
|
62
|
+
from .connection_string_builder import _ConnectionStringBuilder
|
|
63
|
+
|
|
64
|
+
# Cursor Objects
|
|
65
|
+
from .cursor import Cursor
|
|
66
|
+
|
|
67
|
+
# Row Objects
|
|
68
|
+
from .row import Row, RowMapping
|
|
69
|
+
|
|
70
|
+
# Logging Configuration (Simplified single-level DEBUG system)
|
|
71
|
+
from .logging import logger, setup_logging, driver_logger
|
|
72
|
+
|
|
73
|
+
# Constants
|
|
74
|
+
from .constants import ConstantsDDBC, GetInfoConstants, get_info_constants
|
|
75
|
+
|
|
76
|
+
# Pooling
|
|
77
|
+
from .pooling import PoolingManager
|
|
78
|
+
|
|
79
|
+
# ODBC provider selection
|
|
80
|
+
from .odbc_provider import ProviderManager
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def get_native_provider_info() -> dict:
|
|
84
|
+
"""Return the selected native provider for diagnostics.
|
|
85
|
+
|
|
86
|
+
Reports the provider ``id``, package ``version``, resolved ``driver_path``,
|
|
87
|
+
the ``package`` that ships its native binaries, selection ``source``, and
|
|
88
|
+
whether the choice is ``frozen`` (loaded and no longer changeable).
|
|
89
|
+
"""
|
|
90
|
+
return ProviderManager.get_info()
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
# Global registry for tracking active connections (using weak references)
|
|
94
|
+
_active_connections = weakref.WeakSet()
|
|
95
|
+
_connections_lock = threading.Lock()
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def _register_connection(conn):
|
|
99
|
+
"""Register a connection for cleanup before shutdown."""
|
|
100
|
+
with _connections_lock:
|
|
101
|
+
_active_connections.add(conn)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _cleanup_connections():
|
|
105
|
+
"""
|
|
106
|
+
Cleanup function called by atexit to close all active connections.
|
|
107
|
+
|
|
108
|
+
This prevents resource leaks during interpreter shutdown by ensuring
|
|
109
|
+
all ODBC handles are freed in the correct order before Python finalizes.
|
|
110
|
+
"""
|
|
111
|
+
# Make a copy of the connections to avoid modification during iteration
|
|
112
|
+
with _connections_lock:
|
|
113
|
+
connections_to_close = list(_active_connections)
|
|
114
|
+
|
|
115
|
+
for conn in connections_to_close:
|
|
116
|
+
try:
|
|
117
|
+
# Check if connection is still valid and not closed
|
|
118
|
+
if hasattr(conn, "_closed") and not conn._closed:
|
|
119
|
+
# Close will handle both cursors and the connection
|
|
120
|
+
conn.close()
|
|
121
|
+
except Exception as e:
|
|
122
|
+
# Log errors during shutdown cleanup for debugging
|
|
123
|
+
# We're prioritizing crash prevention over error propagation
|
|
124
|
+
try:
|
|
125
|
+
driver_logger.error(
|
|
126
|
+
f"Error during connection cleanup at shutdown: {type(e).__name__}: {e}"
|
|
127
|
+
)
|
|
128
|
+
except Exception:
|
|
129
|
+
# If logging fails during shutdown, silently ignore
|
|
130
|
+
pass
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
# Register cleanup function to run before Python exits
|
|
134
|
+
atexit.register(_cleanup_connections)
|
|
135
|
+
|
|
136
|
+
# GLOBALS
|
|
137
|
+
# Read-Only
|
|
138
|
+
apilevel: str = "2.0"
|
|
139
|
+
paramstyle: str = "pyformat"
|
|
140
|
+
threadsafety: int = 1
|
|
141
|
+
|
|
142
|
+
# Create decimal separator control functions bound to our settings
|
|
143
|
+
from .decimal_config import create_decimal_separator_functions
|
|
144
|
+
|
|
145
|
+
setDecimalSeparator, getDecimalSeparator = create_decimal_separator_functions(_settings)
|
|
146
|
+
|
|
147
|
+
# Import module-level constants from constants module
|
|
148
|
+
from .constants import ( # noqa: F401
|
|
149
|
+
# Enum classes
|
|
150
|
+
AuthType,
|
|
151
|
+
SQLTypes,
|
|
152
|
+
# Helper function
|
|
153
|
+
get_info_constants,
|
|
154
|
+
# SQL Type constants (from ConstantsDDBC)
|
|
155
|
+
SQL_CHAR,
|
|
156
|
+
SQL_VARCHAR,
|
|
157
|
+
SQL_LONGVARCHAR,
|
|
158
|
+
SQL_WCHAR,
|
|
159
|
+
SQL_WVARCHAR,
|
|
160
|
+
SQL_WLONGVARCHAR,
|
|
161
|
+
SQL_DECIMAL,
|
|
162
|
+
SQL_NUMERIC,
|
|
163
|
+
SQL_BIT,
|
|
164
|
+
SQL_TINYINT,
|
|
165
|
+
SQL_SMALLINT,
|
|
166
|
+
SQL_INTEGER,
|
|
167
|
+
SQL_BIGINT,
|
|
168
|
+
SQL_REAL,
|
|
169
|
+
SQL_FLOAT,
|
|
170
|
+
SQL_DOUBLE,
|
|
171
|
+
SQL_BINARY,
|
|
172
|
+
SQL_VARBINARY,
|
|
173
|
+
SQL_LONGVARBINARY,
|
|
174
|
+
SQL_DATE,
|
|
175
|
+
SQL_TIME,
|
|
176
|
+
SQL_TIMESTAMP,
|
|
177
|
+
SQL_TYPE_DATE,
|
|
178
|
+
SQL_TYPE_TIME,
|
|
179
|
+
SQL_TYPE_TIMESTAMP,
|
|
180
|
+
SQL_GUID,
|
|
181
|
+
SQL_XML,
|
|
182
|
+
# SQL Server-specific type constants (pyodbc parity)
|
|
183
|
+
SQL_SS_TIME2,
|
|
184
|
+
SQL_SS_XML,
|
|
185
|
+
SQL_SS_VARIANT,
|
|
186
|
+
# Connection attribute constants
|
|
187
|
+
SQL_ATTR_ACCESS_MODE,
|
|
188
|
+
SQL_ATTR_CONNECTION_TIMEOUT,
|
|
189
|
+
SQL_ATTR_CURRENT_CATALOG,
|
|
190
|
+
SQL_ATTR_LOGIN_TIMEOUT,
|
|
191
|
+
SQL_ATTR_PACKET_SIZE,
|
|
192
|
+
SQL_ATTR_TXN_ISOLATION,
|
|
193
|
+
SQL_TXN_ISOLATION_LEVEL,
|
|
194
|
+
# Legacy statement options
|
|
195
|
+
SQL_ROWSET_SIZE,
|
|
196
|
+
SQL_CONCURRENCY,
|
|
197
|
+
SQL_ROW_NUMBER,
|
|
198
|
+
# Transaction isolation levels
|
|
199
|
+
SQL_TXN_READ_UNCOMMITTED,
|
|
200
|
+
SQL_TXN_READ_COMMITTED,
|
|
201
|
+
SQL_TXN_REPEATABLE_READ,
|
|
202
|
+
SQL_TXN_SERIALIZABLE,
|
|
203
|
+
# Access modes
|
|
204
|
+
SQL_MODE_READ_WRITE,
|
|
205
|
+
SQL_MODE_READ_ONLY,
|
|
206
|
+
# Special constants
|
|
207
|
+
SQL_WMETADATA,
|
|
208
|
+
# GetInfoConstants (all exported as module-level constants)
|
|
209
|
+
SQL_DRIVER_NAME,
|
|
210
|
+
SQL_DRIVER_VER,
|
|
211
|
+
SQL_DRIVER_ODBC_VER,
|
|
212
|
+
SQL_DRIVER_HLIB,
|
|
213
|
+
SQL_DRIVER_HENV,
|
|
214
|
+
SQL_DRIVER_HDBC,
|
|
215
|
+
SQL_DATA_SOURCE_NAME,
|
|
216
|
+
SQL_DATABASE_NAME,
|
|
217
|
+
SQL_SERVER_NAME,
|
|
218
|
+
SQL_USER_NAME,
|
|
219
|
+
SQL_SQL_CONFORMANCE,
|
|
220
|
+
SQL_KEYWORDS,
|
|
221
|
+
SQL_IDENTIFIER_CASE,
|
|
222
|
+
SQL_IDENTIFIER_QUOTE_CHAR,
|
|
223
|
+
SQL_SPECIAL_CHARACTERS,
|
|
224
|
+
SQL_SUBQUERIES,
|
|
225
|
+
SQL_EXPRESSIONS_IN_ORDERBY,
|
|
226
|
+
SQL_CORRELATION_NAME,
|
|
227
|
+
SQL_SEARCH_PATTERN_ESCAPE,
|
|
228
|
+
SQL_CATALOG_TERM,
|
|
229
|
+
SQL_CATALOG_NAME_SEPARATOR,
|
|
230
|
+
SQL_SCHEMA_TERM,
|
|
231
|
+
SQL_TABLE_TERM,
|
|
232
|
+
SQL_PROCEDURES,
|
|
233
|
+
SQL_ACCESSIBLE_TABLES,
|
|
234
|
+
SQL_ACCESSIBLE_PROCEDURES,
|
|
235
|
+
SQL_CATALOG_NAME,
|
|
236
|
+
SQL_CATALOG_USAGE,
|
|
237
|
+
SQL_SCHEMA_USAGE,
|
|
238
|
+
SQL_COLUMN_ALIAS,
|
|
239
|
+
SQL_DESCRIBE_PARAMETER,
|
|
240
|
+
SQL_TXN_CAPABLE,
|
|
241
|
+
SQL_TXN_ISOLATION_OPTION,
|
|
242
|
+
SQL_DEFAULT_TXN_ISOLATION,
|
|
243
|
+
SQL_MULTIPLE_ACTIVE_TXN,
|
|
244
|
+
SQL_NUMERIC_FUNCTIONS,
|
|
245
|
+
SQL_STRING_FUNCTIONS,
|
|
246
|
+
SQL_DATETIME_FUNCTIONS,
|
|
247
|
+
SQL_TIMEDATE_FUNCTIONS,
|
|
248
|
+
SQL_SYSTEM_FUNCTIONS,
|
|
249
|
+
SQL_CONVERT_FUNCTIONS,
|
|
250
|
+
SQL_LIKE_ESCAPE_CLAUSE,
|
|
251
|
+
SQL_MAX_COLUMN_NAME_LEN,
|
|
252
|
+
SQL_MAX_TABLE_NAME_LEN,
|
|
253
|
+
SQL_MAX_SCHEMA_NAME_LEN,
|
|
254
|
+
SQL_MAX_CATALOG_NAME_LEN,
|
|
255
|
+
SQL_MAX_IDENTIFIER_LEN,
|
|
256
|
+
SQL_MAX_STATEMENT_LEN,
|
|
257
|
+
SQL_MAX_CHAR_LITERAL_LEN,
|
|
258
|
+
SQL_MAX_BINARY_LITERAL_LEN,
|
|
259
|
+
SQL_MAX_COLUMNS_IN_TABLE,
|
|
260
|
+
SQL_MAX_COLUMNS_IN_SELECT,
|
|
261
|
+
SQL_MAX_COLUMNS_IN_GROUP_BY,
|
|
262
|
+
SQL_MAX_COLUMNS_IN_ORDER_BY,
|
|
263
|
+
SQL_MAX_COLUMNS_IN_INDEX,
|
|
264
|
+
SQL_MAX_TABLES_IN_SELECT,
|
|
265
|
+
SQL_MAX_CONCURRENT_ACTIVITIES,
|
|
266
|
+
SQL_MAX_DRIVER_CONNECTIONS,
|
|
267
|
+
SQL_MAX_ROW_SIZE,
|
|
268
|
+
SQL_MAX_USER_NAME_LEN,
|
|
269
|
+
SQL_ACTIVE_CONNECTIONS,
|
|
270
|
+
SQL_ACTIVE_STATEMENTS,
|
|
271
|
+
SQL_DATA_SOURCE_READ_ONLY,
|
|
272
|
+
SQL_NEED_LONG_DATA_LEN,
|
|
273
|
+
SQL_GETDATA_EXTENSIONS,
|
|
274
|
+
SQL_CURSOR_COMMIT_BEHAVIOR,
|
|
275
|
+
SQL_CURSOR_ROLLBACK_BEHAVIOR,
|
|
276
|
+
SQL_CURSOR_SENSITIVITY,
|
|
277
|
+
SQL_BOOKMARK_PERSISTENCE,
|
|
278
|
+
SQL_DYNAMIC_CURSOR_ATTRIBUTES1,
|
|
279
|
+
SQL_DYNAMIC_CURSOR_ATTRIBUTES2,
|
|
280
|
+
SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1,
|
|
281
|
+
SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2,
|
|
282
|
+
SQL_STATIC_CURSOR_ATTRIBUTES1,
|
|
283
|
+
SQL_STATIC_CURSOR_ATTRIBUTES2,
|
|
284
|
+
SQL_KEYSET_CURSOR_ATTRIBUTES1,
|
|
285
|
+
SQL_KEYSET_CURSOR_ATTRIBUTES2,
|
|
286
|
+
SQL_SCROLL_OPTIONS,
|
|
287
|
+
SQL_SCROLL_CONCURRENCY,
|
|
288
|
+
SQL_FETCH_DIRECTION,
|
|
289
|
+
SQL_STATIC_SENSITIVITY,
|
|
290
|
+
SQL_BATCH_SUPPORT,
|
|
291
|
+
SQL_BATCH_ROW_COUNT,
|
|
292
|
+
SQL_PARAM_ARRAY_ROW_COUNTS,
|
|
293
|
+
SQL_PARAM_ARRAY_SELECTS,
|
|
294
|
+
SQL_PROCEDURE_TERM,
|
|
295
|
+
SQL_POSITIONED_STATEMENTS,
|
|
296
|
+
SQL_GROUP_BY,
|
|
297
|
+
SQL_OJ_CAPABILITIES,
|
|
298
|
+
SQL_ORDER_BY_COLUMNS_IN_SELECT,
|
|
299
|
+
SQL_OUTER_JOINS,
|
|
300
|
+
SQL_QUOTED_IDENTIFIER_CASE,
|
|
301
|
+
SQL_CONCAT_NULL_BEHAVIOR,
|
|
302
|
+
SQL_NULL_COLLATION,
|
|
303
|
+
SQL_ALTER_TABLE,
|
|
304
|
+
SQL_UNION,
|
|
305
|
+
SQL_DDL_INDEX,
|
|
306
|
+
SQL_MULT_RESULT_SETS,
|
|
307
|
+
SQL_OWNER_USAGE,
|
|
308
|
+
SQL_QUALIFIER_USAGE,
|
|
309
|
+
SQL_TIMEDATE_ADD_INTERVALS,
|
|
310
|
+
SQL_TIMEDATE_DIFF_INTERVALS,
|
|
311
|
+
# SQLGetInfo return values (not information types)
|
|
312
|
+
SQL_IC_UPPER,
|
|
313
|
+
SQL_IC_LOWER,
|
|
314
|
+
SQL_IC_SENSITIVE,
|
|
315
|
+
SQL_IC_MIXED,
|
|
316
|
+
SQL_SC_SQL92_ENTRY,
|
|
317
|
+
SQL_SC_FIPS127_2_TRANSITIONAL,
|
|
318
|
+
SQL_SC_SQL92_INTERMEDIATE,
|
|
319
|
+
SQL_SC_SQL92_FULL,
|
|
320
|
+
# Deprecated legacy values, not SQL conformance flags
|
|
321
|
+
SQL_SQL92_ENTRY_SQL,
|
|
322
|
+
SQL_SQL92_INTERMEDIATE_SQL,
|
|
323
|
+
SQL_SQL92_FULL_SQL,
|
|
324
|
+
)
|
|
325
|
+
|
|
326
|
+
__all__ = [
|
|
327
|
+
# Exception classes
|
|
328
|
+
"Warning",
|
|
329
|
+
"Error",
|
|
330
|
+
"InterfaceError",
|
|
331
|
+
"DatabaseError",
|
|
332
|
+
"DataError",
|
|
333
|
+
"OperationalError",
|
|
334
|
+
"IntegrityError",
|
|
335
|
+
"InternalError",
|
|
336
|
+
"ProgrammingError",
|
|
337
|
+
"NotSupportedError",
|
|
338
|
+
"ConnectionStringParseError",
|
|
339
|
+
# Type objects and functions
|
|
340
|
+
"Date",
|
|
341
|
+
"Time",
|
|
342
|
+
"Timestamp",
|
|
343
|
+
"DateFromTicks",
|
|
344
|
+
"TimeFromTicks",
|
|
345
|
+
"TimestampFromTicks",
|
|
346
|
+
"Binary",
|
|
347
|
+
"STRING",
|
|
348
|
+
"BINARY",
|
|
349
|
+
"NUMBER",
|
|
350
|
+
"DATETIME",
|
|
351
|
+
"ROWID",
|
|
352
|
+
# Connection and cursor classes
|
|
353
|
+
"connect",
|
|
354
|
+
"Connection",
|
|
355
|
+
"TokenProvider",
|
|
356
|
+
"Cursor",
|
|
357
|
+
"Row",
|
|
358
|
+
"RowMapping",
|
|
359
|
+
# Settings
|
|
360
|
+
"Settings",
|
|
361
|
+
"get_settings",
|
|
362
|
+
# Logging
|
|
363
|
+
"logger",
|
|
364
|
+
"setup_logging",
|
|
365
|
+
"driver_logger",
|
|
366
|
+
# Decimal functions
|
|
367
|
+
"setDecimalSeparator",
|
|
368
|
+
"getDecimalSeparator",
|
|
369
|
+
# Pooling
|
|
370
|
+
"pooling",
|
|
371
|
+
"PoolingManager",
|
|
372
|
+
# Constants - Enum classes
|
|
373
|
+
"AuthType",
|
|
374
|
+
"SQLTypes",
|
|
375
|
+
"get_info_constants",
|
|
376
|
+
# SQL Type constants
|
|
377
|
+
"SQL_CHAR",
|
|
378
|
+
"SQL_VARCHAR",
|
|
379
|
+
"SQL_LONGVARCHAR",
|
|
380
|
+
"SQL_WCHAR",
|
|
381
|
+
"SQL_WVARCHAR",
|
|
382
|
+
"SQL_WLONGVARCHAR",
|
|
383
|
+
"SQL_DECIMAL",
|
|
384
|
+
"SQL_NUMERIC",
|
|
385
|
+
"SQL_BIT",
|
|
386
|
+
"SQL_TINYINT",
|
|
387
|
+
"SQL_SMALLINT",
|
|
388
|
+
"SQL_INTEGER",
|
|
389
|
+
"SQL_BIGINT",
|
|
390
|
+
"SQL_REAL",
|
|
391
|
+
"SQL_FLOAT",
|
|
392
|
+
"SQL_DOUBLE",
|
|
393
|
+
"SQL_BINARY",
|
|
394
|
+
"SQL_VARBINARY",
|
|
395
|
+
"SQL_LONGVARBINARY",
|
|
396
|
+
"SQL_DATE",
|
|
397
|
+
"SQL_TIME",
|
|
398
|
+
"SQL_TIMESTAMP",
|
|
399
|
+
"SQL_TYPE_DATE",
|
|
400
|
+
"SQL_TYPE_TIME",
|
|
401
|
+
"SQL_TYPE_TIMESTAMP",
|
|
402
|
+
"SQL_GUID",
|
|
403
|
+
"SQL_XML",
|
|
404
|
+
# SQL Server-specific type constants (pyodbc parity)
|
|
405
|
+
"SQL_SS_TIME2",
|
|
406
|
+
"SQL_SS_XML",
|
|
407
|
+
"SQL_SS_VARIANT",
|
|
408
|
+
# Connection attribute constants
|
|
409
|
+
"SQL_ATTR_ACCESS_MODE",
|
|
410
|
+
"SQL_ATTR_CONNECTION_TIMEOUT",
|
|
411
|
+
"SQL_ATTR_CURRENT_CATALOG",
|
|
412
|
+
"SQL_ATTR_LOGIN_TIMEOUT",
|
|
413
|
+
"SQL_ATTR_PACKET_SIZE",
|
|
414
|
+
"SQL_ATTR_TXN_ISOLATION",
|
|
415
|
+
"SQL_TXN_ISOLATION_LEVEL",
|
|
416
|
+
# Legacy statement options
|
|
417
|
+
"SQL_ROWSET_SIZE",
|
|
418
|
+
"SQL_CONCURRENCY",
|
|
419
|
+
"SQL_ROW_NUMBER",
|
|
420
|
+
# Transaction isolation levels
|
|
421
|
+
"SQL_TXN_READ_UNCOMMITTED",
|
|
422
|
+
"SQL_TXN_READ_COMMITTED",
|
|
423
|
+
"SQL_TXN_REPEATABLE_READ",
|
|
424
|
+
"SQL_TXN_SERIALIZABLE",
|
|
425
|
+
# Access modes
|
|
426
|
+
"SQL_MODE_READ_WRITE",
|
|
427
|
+
"SQL_MODE_READ_ONLY",
|
|
428
|
+
# Special constants
|
|
429
|
+
"SQL_WMETADATA",
|
|
430
|
+
# GetInfo constants
|
|
431
|
+
"SQL_DRIVER_NAME",
|
|
432
|
+
"SQL_DRIVER_VER",
|
|
433
|
+
"SQL_DRIVER_ODBC_VER",
|
|
434
|
+
"SQL_DRIVER_HLIB",
|
|
435
|
+
"SQL_DRIVER_HENV",
|
|
436
|
+
"SQL_DRIVER_HDBC",
|
|
437
|
+
"SQL_DATA_SOURCE_NAME",
|
|
438
|
+
"SQL_DATABASE_NAME",
|
|
439
|
+
"SQL_SERVER_NAME",
|
|
440
|
+
"SQL_USER_NAME",
|
|
441
|
+
"SQL_SQL_CONFORMANCE",
|
|
442
|
+
"SQL_KEYWORDS",
|
|
443
|
+
"SQL_IDENTIFIER_CASE",
|
|
444
|
+
"SQL_IDENTIFIER_QUOTE_CHAR",
|
|
445
|
+
"SQL_SPECIAL_CHARACTERS",
|
|
446
|
+
"SQL_SUBQUERIES",
|
|
447
|
+
"SQL_EXPRESSIONS_IN_ORDERBY",
|
|
448
|
+
"SQL_CORRELATION_NAME",
|
|
449
|
+
"SQL_SEARCH_PATTERN_ESCAPE",
|
|
450
|
+
"SQL_CATALOG_TERM",
|
|
451
|
+
"SQL_CATALOG_NAME_SEPARATOR",
|
|
452
|
+
"SQL_SCHEMA_TERM",
|
|
453
|
+
"SQL_TABLE_TERM",
|
|
454
|
+
"SQL_PROCEDURES",
|
|
455
|
+
"SQL_ACCESSIBLE_TABLES",
|
|
456
|
+
"SQL_ACCESSIBLE_PROCEDURES",
|
|
457
|
+
"SQL_CATALOG_NAME",
|
|
458
|
+
"SQL_CATALOG_USAGE",
|
|
459
|
+
"SQL_SCHEMA_USAGE",
|
|
460
|
+
"SQL_COLUMN_ALIAS",
|
|
461
|
+
"SQL_DESCRIBE_PARAMETER",
|
|
462
|
+
"SQL_TXN_CAPABLE",
|
|
463
|
+
"SQL_TXN_ISOLATION_OPTION",
|
|
464
|
+
"SQL_DEFAULT_TXN_ISOLATION",
|
|
465
|
+
"SQL_MULTIPLE_ACTIVE_TXN",
|
|
466
|
+
"SQL_NUMERIC_FUNCTIONS",
|
|
467
|
+
"SQL_STRING_FUNCTIONS",
|
|
468
|
+
"SQL_DATETIME_FUNCTIONS",
|
|
469
|
+
"SQL_TIMEDATE_FUNCTIONS",
|
|
470
|
+
"SQL_SYSTEM_FUNCTIONS",
|
|
471
|
+
"SQL_CONVERT_FUNCTIONS",
|
|
472
|
+
"SQL_LIKE_ESCAPE_CLAUSE",
|
|
473
|
+
"SQL_MAX_COLUMN_NAME_LEN",
|
|
474
|
+
"SQL_MAX_TABLE_NAME_LEN",
|
|
475
|
+
"SQL_MAX_SCHEMA_NAME_LEN",
|
|
476
|
+
"SQL_MAX_CATALOG_NAME_LEN",
|
|
477
|
+
"SQL_MAX_IDENTIFIER_LEN",
|
|
478
|
+
"SQL_MAX_STATEMENT_LEN",
|
|
479
|
+
"SQL_MAX_CHAR_LITERAL_LEN",
|
|
480
|
+
"SQL_MAX_BINARY_LITERAL_LEN",
|
|
481
|
+
"SQL_MAX_COLUMNS_IN_TABLE",
|
|
482
|
+
"SQL_MAX_COLUMNS_IN_SELECT",
|
|
483
|
+
"SQL_MAX_COLUMNS_IN_GROUP_BY",
|
|
484
|
+
"SQL_MAX_COLUMNS_IN_ORDER_BY",
|
|
485
|
+
"SQL_MAX_COLUMNS_IN_INDEX",
|
|
486
|
+
"SQL_MAX_TABLES_IN_SELECT",
|
|
487
|
+
"SQL_MAX_CONCURRENT_ACTIVITIES",
|
|
488
|
+
"SQL_MAX_DRIVER_CONNECTIONS",
|
|
489
|
+
"SQL_MAX_ROW_SIZE",
|
|
490
|
+
"SQL_MAX_USER_NAME_LEN",
|
|
491
|
+
"SQL_ACTIVE_CONNECTIONS",
|
|
492
|
+
"SQL_ACTIVE_STATEMENTS",
|
|
493
|
+
"SQL_DATA_SOURCE_READ_ONLY",
|
|
494
|
+
"SQL_NEED_LONG_DATA_LEN",
|
|
495
|
+
"SQL_GETDATA_EXTENSIONS",
|
|
496
|
+
"SQL_CURSOR_COMMIT_BEHAVIOR",
|
|
497
|
+
"SQL_CURSOR_ROLLBACK_BEHAVIOR",
|
|
498
|
+
"SQL_CURSOR_SENSITIVITY",
|
|
499
|
+
"SQL_BOOKMARK_PERSISTENCE",
|
|
500
|
+
"SQL_DYNAMIC_CURSOR_ATTRIBUTES1",
|
|
501
|
+
"SQL_DYNAMIC_CURSOR_ATTRIBUTES2",
|
|
502
|
+
"SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1",
|
|
503
|
+
"SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2",
|
|
504
|
+
"SQL_STATIC_CURSOR_ATTRIBUTES1",
|
|
505
|
+
"SQL_STATIC_CURSOR_ATTRIBUTES2",
|
|
506
|
+
"SQL_KEYSET_CURSOR_ATTRIBUTES1",
|
|
507
|
+
"SQL_KEYSET_CURSOR_ATTRIBUTES2",
|
|
508
|
+
"SQL_SCROLL_OPTIONS",
|
|
509
|
+
"SQL_SCROLL_CONCURRENCY",
|
|
510
|
+
"SQL_FETCH_DIRECTION",
|
|
511
|
+
"SQL_STATIC_SENSITIVITY",
|
|
512
|
+
"SQL_BATCH_SUPPORT",
|
|
513
|
+
"SQL_BATCH_ROW_COUNT",
|
|
514
|
+
"SQL_PARAM_ARRAY_ROW_COUNTS",
|
|
515
|
+
"SQL_PARAM_ARRAY_SELECTS",
|
|
516
|
+
"SQL_PROCEDURE_TERM",
|
|
517
|
+
"SQL_POSITIONED_STATEMENTS",
|
|
518
|
+
"SQL_GROUP_BY",
|
|
519
|
+
"SQL_OJ_CAPABILITIES",
|
|
520
|
+
"SQL_ORDER_BY_COLUMNS_IN_SELECT",
|
|
521
|
+
"SQL_OUTER_JOINS",
|
|
522
|
+
"SQL_QUOTED_IDENTIFIER_CASE",
|
|
523
|
+
"SQL_CONCAT_NULL_BEHAVIOR",
|
|
524
|
+
"SQL_NULL_COLLATION",
|
|
525
|
+
"SQL_ALTER_TABLE",
|
|
526
|
+
"SQL_UNION",
|
|
527
|
+
"SQL_DDL_INDEX",
|
|
528
|
+
"SQL_MULT_RESULT_SETS",
|
|
529
|
+
"SQL_OWNER_USAGE",
|
|
530
|
+
"SQL_QUALIFIER_USAGE",
|
|
531
|
+
"SQL_TIMEDATE_ADD_INTERVALS",
|
|
532
|
+
"SQL_TIMEDATE_DIFF_INTERVALS",
|
|
533
|
+
# SQLGetInfo return values (not information types)
|
|
534
|
+
"SQL_IC_UPPER",
|
|
535
|
+
"SQL_IC_LOWER",
|
|
536
|
+
"SQL_IC_SENSITIVE",
|
|
537
|
+
"SQL_IC_MIXED",
|
|
538
|
+
"SQL_SC_SQL92_ENTRY",
|
|
539
|
+
"SQL_SC_FIPS127_2_TRANSITIONAL",
|
|
540
|
+
"SQL_SC_SQL92_INTERMEDIATE",
|
|
541
|
+
"SQL_SC_SQL92_FULL",
|
|
542
|
+
# Deprecated legacy values, not SQL conformance flags
|
|
543
|
+
"SQL_SQL92_ENTRY_SQL",
|
|
544
|
+
"SQL_SQL92_INTERMEDIATE_SQL",
|
|
545
|
+
"SQL_SQL92_FULL_SQL",
|
|
546
|
+
# API level globals
|
|
547
|
+
"apilevel",
|
|
548
|
+
"paramstyle",
|
|
549
|
+
"threadsafety",
|
|
550
|
+
# Module properties
|
|
551
|
+
"lowercase",
|
|
552
|
+
"native_uuid",
|
|
553
|
+
"native_provider",
|
|
554
|
+
# Native provider diagnostics
|
|
555
|
+
"get_native_provider_info",
|
|
556
|
+
]
|
|
557
|
+
|
|
558
|
+
|
|
559
|
+
def pooling(max_size: int = 100, idle_timeout: int = 600, enabled: bool = True) -> None:
|
|
560
|
+
"""
|
|
561
|
+
Enable connection pooling with the specified parameters.
|
|
562
|
+
By default:
|
|
563
|
+
- If not explicitly called, pooling will be auto-enabled with default values.
|
|
564
|
+
|
|
565
|
+
Args:
|
|
566
|
+
max_size (int): Maximum number of connections in the pool.
|
|
567
|
+
idle_timeout (int): Time in seconds before idle connections are closed.
|
|
568
|
+
enabled (bool): Whether to enable or disable pooling.
|
|
569
|
+
|
|
570
|
+
Returns:
|
|
571
|
+
None
|
|
572
|
+
"""
|
|
573
|
+
if not enabled:
|
|
574
|
+
PoolingManager.disable()
|
|
575
|
+
else:
|
|
576
|
+
PoolingManager.enable(max_size, idle_timeout)
|
|
577
|
+
|
|
578
|
+
|
|
579
|
+
_original_module_setattr = sys.modules[__name__].__setattr__
|
|
580
|
+
|
|
581
|
+
|
|
582
|
+
def _custom_setattr(name, value):
|
|
583
|
+
if name == "lowercase":
|
|
584
|
+
with _settings_lock:
|
|
585
|
+
_settings.lowercase = bool(value)
|
|
586
|
+
# Update the module's lowercase variable
|
|
587
|
+
_original_module_setattr(name, _settings.lowercase)
|
|
588
|
+
else:
|
|
589
|
+
_original_module_setattr(name, value)
|
|
590
|
+
|
|
591
|
+
|
|
592
|
+
# Replace the module's __setattr__ with our custom version
|
|
593
|
+
sys.modules[__name__].__setattr__ = _custom_setattr
|
|
594
|
+
|
|
595
|
+
|
|
596
|
+
# Create a custom module class that uses properties instead of __setattr__
|
|
597
|
+
class _MSSQLModule(types.ModuleType):
|
|
598
|
+
@property
|
|
599
|
+
def lowercase(self) -> bool:
|
|
600
|
+
"""Get the lowercase setting."""
|
|
601
|
+
return _settings.lowercase
|
|
602
|
+
|
|
603
|
+
@lowercase.setter
|
|
604
|
+
def lowercase(self, value: bool) -> None:
|
|
605
|
+
"""Set the lowercase setting."""
|
|
606
|
+
if not isinstance(value, bool):
|
|
607
|
+
raise ValueError("lowercase must be a boolean value")
|
|
608
|
+
with _settings_lock:
|
|
609
|
+
_settings.lowercase = value
|
|
610
|
+
|
|
611
|
+
@property
|
|
612
|
+
def native_uuid(self) -> bool:
|
|
613
|
+
"""Get the native_uuid setting.
|
|
614
|
+
|
|
615
|
+
Controls whether UNIQUEIDENTIFIER columns return uuid.UUID objects (True)
|
|
616
|
+
or str (False). Default is True.
|
|
617
|
+
Set to False to return str for pyodbc-compatible migration.
|
|
618
|
+
"""
|
|
619
|
+
return _settings.native_uuid
|
|
620
|
+
|
|
621
|
+
@native_uuid.setter
|
|
622
|
+
def native_uuid(self, value: bool) -> None:
|
|
623
|
+
"""Set the native_uuid setting."""
|
|
624
|
+
if not isinstance(value, bool):
|
|
625
|
+
raise ValueError("native_uuid must be a boolean value")
|
|
626
|
+
with _settings_lock:
|
|
627
|
+
_settings.native_uuid = value
|
|
628
|
+
|
|
629
|
+
@property
|
|
630
|
+
def native_provider(self) -> str:
|
|
631
|
+
"""Get the native ODBC provider that will be (or was) loaded.
|
|
632
|
+
|
|
633
|
+
Honored only when set before the first connection; a later change is
|
|
634
|
+
ignored with a warning. The ``MSSQL_PYTHON_NATIVE_PROVIDER`` environment
|
|
635
|
+
variable takes precedence over this property.
|
|
636
|
+
"""
|
|
637
|
+
return ProviderManager.effective()
|
|
638
|
+
|
|
639
|
+
@native_provider.setter
|
|
640
|
+
def native_provider(self, value: Optional[str]) -> None:
|
|
641
|
+
"""Set the native ODBC provider selection (or None to clear)."""
|
|
642
|
+
ProviderManager.set_property(value)
|
|
643
|
+
|
|
644
|
+
|
|
645
|
+
# Replace the current module with our custom module class
|
|
646
|
+
old_module: types.ModuleType = sys.modules[__name__]
|
|
647
|
+
new_module: _MSSQLModule = _MSSQLModule(__name__)
|
|
648
|
+
|
|
649
|
+
# Copy all existing attributes to the new module
|
|
650
|
+
for attr_name in dir(old_module):
|
|
651
|
+
if attr_name != "__class__":
|
|
652
|
+
try:
|
|
653
|
+
setattr(new_module, attr_name, getattr(old_module, attr_name))
|
|
654
|
+
except AttributeError:
|
|
655
|
+
pass
|
|
656
|
+
|
|
657
|
+
# Replace the module in sys.modules
|
|
658
|
+
sys.modules[__name__] = new_module
|
|
659
|
+
|
|
660
|
+
# Initialize property values
|
|
661
|
+
lowercase: bool = _settings.lowercase
|
|
662
|
+
native_uuid: bool = _settings.native_uuid
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""Asynchronous query support backed directly by mssql-py-core.
|
|
2
|
+
|
|
3
|
+
The internal entry points are ``_AsyncConnection`` and ``_AsyncCursor``.
|
|
4
|
+
Their methods retain DB-API names, but the classes are not stable public API.
|
|
5
|
+
|
|
6
|
+
Warning:
|
|
7
|
+
Async query execution APIs are under active development and are not intended
|
|
8
|
+
for production use. Their signatures, behavior, error handling, and compatibility
|
|
9
|
+
may change without notice.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from ._native import load_py_core
|
|
13
|
+
from .async_connection import _AsyncConnection # pyright: ignore[reportPrivateUsage]
|
|
14
|
+
from .async_cursor import _AsyncCursor # pyright: ignore[reportPrivateUsage]
|
|
15
|
+
from .exception_translator import (
|
|
16
|
+
DataError,
|
|
17
|
+
DatabaseError,
|
|
18
|
+
Error,
|
|
19
|
+
IntegrityError,
|
|
20
|
+
InterfaceError,
|
|
21
|
+
InternalError,
|
|
22
|
+
NotSupportedError,
|
|
23
|
+
OperationalError,
|
|
24
|
+
ProgrammingError,
|
|
25
|
+
Warning,
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
__all__ = [
|
|
29
|
+
"DataError",
|
|
30
|
+
"DatabaseError",
|
|
31
|
+
"Error",
|
|
32
|
+
"IntegrityError",
|
|
33
|
+
"InterfaceError",
|
|
34
|
+
"InternalError",
|
|
35
|
+
"NotSupportedError",
|
|
36
|
+
"OperationalError",
|
|
37
|
+
"ProgrammingError",
|
|
38
|
+
"Warning",
|
|
39
|
+
"load_py_core",
|
|
40
|
+
]
|