mssql-python 1.16.0__cp315-cp315-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.
@@ -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
+ ]