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