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,701 @@
1
+ """
2
+ Copyright (c) Microsoft Corporation.
3
+ Licensed under the MIT license.
4
+ This module contains the constants used in the DDBC module.
5
+ """
6
+
7
+ from enum import Enum
8
+ from typing import Dict, Optional, Tuple
9
+
10
+
11
+ class ConstantsDDBC(Enum):
12
+ """
13
+ Constants used in the DDBC module.
14
+ """
15
+
16
+ SQL_HANDLE_ENV = 1
17
+ SQL_HANDLE_DBC = 2
18
+ SQL_HANDLE_STMT = 3
19
+ SQL_SUCCESS = 0
20
+ SQL_SUCCESS_WITH_INFO = 1
21
+ SQL_NO_DATA = 100
22
+ SQL_STILL_EXECUTING = 2
23
+ SQL_NTS = -3
24
+ SQL_DRIVER_NOPROMPT = 0
25
+ SQL_IS_INTEGER = -6
26
+ SQL_OV_DDBC3_80 = 380
27
+ SQL_ERROR = -1
28
+ SQL_INVALID_HANDLE = -2
29
+ SQL_NULL_HANDLE = 0
30
+ SQL_OV_DDBC3 = 3
31
+ SQL_COMMIT = 0
32
+ SQL_ROLLBACK = 1
33
+ SQL_SMALLINT = 5
34
+ SQL_CHAR = 1
35
+ SQL_WCHAR = -8
36
+ SQL_WVARCHAR = -9
37
+ SQL_BIT = -7
38
+ SQL_TINYINT = -6
39
+ SQL_BIGINT = -5
40
+ SQL_BINARY = -2
41
+ SQL_VARBINARY = -3
42
+ SQL_LONGVARBINARY = -4
43
+ SQL_LONGVARCHAR = -1
44
+ SQL_UNKNOWN_TYPE = 0
45
+ SQL_NUMERIC = 2
46
+ SQL_DECIMAL = 3
47
+ SQL_INTEGER = 4
48
+ SQL_FLOAT = 6
49
+ SQL_REAL = 7
50
+ SQL_DOUBLE = 8
51
+ SQL_DATETIME = 9
52
+ SQL_INTERVAL = 10
53
+ SQL_TIMESTAMP = 11
54
+ SQL_DATE = 9
55
+ SQL_TIME = 10
56
+ SQL_VARCHAR = 12
57
+ SQL_TYPE_DATE = 91
58
+ SQL_TYPE_TIME = 92
59
+ SQL_TYPE_TIMESTAMP = 93
60
+ SQL_TYPE_TIMESTAMP_WITH_TIMEZONE = 95
61
+ SQL_GUID = -11
62
+ SQL_XML = 241
63
+ SQL_SMALLDATETIME = 58
64
+ SQL_TIMESTAMPOFFSET = 43
65
+ SQL_DATETIME2 = 42
66
+ SQL_SMALLMONEY = 122
67
+ SQL_MONEY = 60
68
+ SQL_WLONGVARCHAR = -10
69
+ SQL_C_BIT = -7
70
+ SQL_C_TINYINT = -6
71
+ SQL_C_SBIGINT = -25
72
+ SQL_C_BINARY = -2
73
+ SQL_AUTOCOMMIT_ON = 1
74
+ SQL_AUTOCOMMIT_OFF = 0
75
+ SQL_C_VARBINARY = -3
76
+ SQL_C_LONGVARBINARY = -4
77
+ SQL_C_LONGVARCHAR = -1
78
+ # Legacy alias: text parameters bind as ODBC SQL_C_WCHAR (-8), not SQL_C_CHAR (1).
79
+ SQL_C_CHAR = -8
80
+ SQL_C_NUMERIC = 2
81
+ SQL_C_DECIMAL = 3
82
+ SQL_C_LONG = 4
83
+ SQL_C_SHORT = 5
84
+ SQL_C_FLOAT = 7
85
+ SQL_C_DOUBLE = 8
86
+ SQL_C_TYPE_DATE = 91
87
+ SQL_C_TYPE_TIME = 92
88
+ SQL_C_TYPE_TIMESTAMP = 93
89
+ SQL_C_TYPE_TIMESTAMP_WITH_TIMEZONE = 95
90
+ SQL_C_GUID = -11
91
+ SQL_DESC_TYPE = 2
92
+ SQL_DESC_LENGTH = 3
93
+ SQL_DESC_NAME = 4
94
+ SQL_ROW_SUCCESS = 0
95
+ SQL_ROW_SUCCESS_WITH_INFO = 1
96
+ SQL_ROW_NOROW = 100
97
+ SQL_CURSOR_FORWARD_ONLY = 0
98
+ SQL_CURSOR_STATIC = 3
99
+ SQL_CURSOR_KEYSET_DRIVEN = 2
100
+ SQL_CURSOR_DYNAMIC = 3
101
+ SQL_NULL_DATA = -1
102
+ SQL_C_DEFAULT = 99
103
+ SQL_BIND_BY_COLUMN = 0
104
+ SQL_PARAM_INPUT = 1
105
+ SQL_PARAM_OUTPUT = 2
106
+ SQL_PARAM_INPUT_OUTPUT = 3
107
+ SQL_C_WCHAR = -8
108
+ SQL_NULLABLE = 1
109
+ SQL_MAX_NUMERIC_LEN = 16
110
+
111
+ SQL_FETCH_NEXT = 1
112
+ SQL_FETCH_FIRST = 2
113
+ SQL_FETCH_LAST = 3
114
+ SQL_FETCH_PRIOR = 4
115
+ SQL_FETCH_ABSOLUTE = 5
116
+ SQL_FETCH_RELATIVE = 6
117
+ SQL_FETCH_BOOKMARK = 8
118
+ SQL_SS_UDT = -151
119
+ SQL_DATETIMEOFFSET = -155
120
+ SQL_SS_TIME2 = -154
121
+ SQL_SS_XML = -152
122
+ SQL_SS_VARIANT = -150
123
+ SQL_C_SS_TIMESTAMPOFFSET = 0x4001
124
+ SQL_SCOPE_CURROW = 0
125
+ SQL_BEST_ROWID = 1
126
+ SQL_ROWVER = 2
127
+ SQL_NO_NULLS = 0
128
+ SQL_NULLABLE_UNKNOWN = 2
129
+ SQL_INDEX_UNIQUE = 0
130
+ SQL_INDEX_ALL = 1
131
+ SQL_QUICK = 0
132
+ SQL_ENSURE = 1
133
+
134
+ # Connection Attribute Constants for set_attr()
135
+ SQL_ATTR_ACCESS_MODE = 101
136
+ SQL_ATTR_AUTOCOMMIT = 102
137
+ SQL_ATTR_CURSOR_TYPE = 6
138
+ SQL_ATTR_ROW_BIND_TYPE = 5
139
+ SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE = 117
140
+ SQL_ATTR_ROW_ARRAY_SIZE = 27
141
+ SQL_ATTR_ASYNC_DBC_EVENT = 119
142
+ SQL_ATTR_DDBC_VERSION = 200
143
+ SQL_ATTR_ASYNC_STMT_EVENT = 29
144
+ SQL_ATTR_ROWS_FETCHED_PTR = 26
145
+ SQL_ATTR_ROW_STATUS_PTR = 25
146
+ SQL_ATTR_CONNECTION_TIMEOUT = 113
147
+ SQL_ATTR_CURRENT_CATALOG = 109
148
+ SQL_ATTR_LOGIN_TIMEOUT = 103
149
+ SQL_ATTR_ODBC_CURSORS = 110
150
+ SQL_ATTR_PACKET_SIZE = 112
151
+ SQL_ATTR_QUIET_MODE = 111
152
+ SQL_ATTR_TXN_ISOLATION = 108
153
+ SQL_TXN_ISOLATION_LEVEL = SQL_ATTR_TXN_ISOLATION # Legacy Python spelling
154
+ SQL_ATTR_TRACE = 104
155
+ SQL_ATTR_TRACEFILE = 105
156
+ SQL_ATTR_TRANSLATE_LIB = 106
157
+ SQL_ATTR_TRANSLATE_OPTION = 107
158
+ SQL_ATTR_CONNECTION_POOLING = 201
159
+ SQL_ATTR_CP_MATCH = 202
160
+ SQL_ATTR_ASYNC_ENABLE = 4
161
+ SQL_ATTR_ENLIST_IN_DTC = 1207
162
+ SQL_ATTR_ENLIST_IN_XA = 1208
163
+ SQL_ATTR_CONNECTION_DEAD = 1209
164
+ SQL_ATTR_SERVER_NAME = 13
165
+ SQL_ATTR_RESET_CONNECTION = 116
166
+
167
+ # SQL Server-specific connection option constants
168
+ SQL_COPT_SS_ACCESS_TOKEN = 1256
169
+
170
+ # Transaction Isolation Level Constants
171
+ SQL_TXN_READ_UNCOMMITTED = 1
172
+ SQL_TXN_READ_COMMITTED = 2
173
+ SQL_TXN_REPEATABLE_READ = 4
174
+ SQL_TXN_SERIALIZABLE = 8
175
+
176
+ # Access Mode Constants
177
+ SQL_MODE_READ_WRITE = 0
178
+ SQL_MODE_READ_ONLY = 1
179
+
180
+ # Connection Dead Constants
181
+ SQL_CD_TRUE = 1
182
+ SQL_CD_FALSE = 0
183
+
184
+ # ODBC Cursors Constants
185
+ SQL_CUR_USE_IF_NEEDED = 0
186
+ SQL_CUR_USE_ODBC = 1
187
+ SQL_CUR_USE_DRIVER = 2
188
+
189
+ # Reset Connection Constants
190
+ SQL_RESET_CONNECTION_YES = 1
191
+
192
+ # Query Timeout Constants
193
+ SQL_ATTR_QUERY_TIMEOUT = 0
194
+
195
+ # Legacy statement options, not SQLGetInfo information types
196
+ SQL_CONCURRENCY = 7
197
+ SQL_ROWSET_SIZE = 9
198
+ SQL_ROW_NUMBER = 14
199
+
200
+ # SQLGetInfo return values, not information types
201
+ SQL_IC_UPPER = 1
202
+ SQL_IC_LOWER = 2
203
+ SQL_IC_SENSITIVE = 3
204
+ SQL_IC_MIXED = 4
205
+ SQL_SC_SQL92_ENTRY = 1
206
+ SQL_SC_FIPS127_2_TRANSITIONAL = 2
207
+ SQL_SC_SQL92_INTERMEDIATE = 4
208
+ SQL_SC_SQL92_FULL = 8
209
+
210
+ # Deprecated compatibility values; use SQL_SC_* for SQL_SQL_CONFORMANCE results.
211
+ SQL_SQL92_ENTRY_SQL = 127
212
+ SQL_SQL92_INTERMEDIATE_SQL = 128
213
+ SQL_SQL92_FULL_SQL = 129
214
+
215
+
216
+ class GetInfoConstants(Enum):
217
+ """ODBC information-type IDs plus deprecated compatibility members.
218
+
219
+ The deprecated members at the end retain their original values throughout
220
+ 1.x, but are not information-type names. See CHANGELOG.md for migration.
221
+ """
222
+
223
+ # Driver and database information
224
+ SQL_DRIVER_NAME = 6
225
+ SQL_DRIVER_VER = 7
226
+ SQL_DRIVER_ODBC_VER = 77
227
+ SQL_DRIVER_HLIB = 76
228
+ SQL_DRIVER_HENV = 4
229
+ SQL_DRIVER_HDBC = 3
230
+ SQL_DATA_SOURCE_NAME = 2
231
+ SQL_DATABASE_NAME = 16
232
+ SQL_SERVER_NAME = 13
233
+ SQL_USER_NAME = 47
234
+
235
+ # SQL conformance and support
236
+ SQL_SQL_CONFORMANCE = 118
237
+ SQL_KEYWORDS = 89
238
+ SQL_IDENTIFIER_CASE = 28
239
+ SQL_IDENTIFIER_QUOTE_CHAR = 29
240
+ SQL_SPECIAL_CHARACTERS = 94
241
+ SQL_SUBQUERIES = 95
242
+ SQL_EXPRESSIONS_IN_ORDERBY = 27
243
+ SQL_CORRELATION_NAME = 74
244
+ SQL_SEARCH_PATTERN_ESCAPE = 14
245
+
246
+ # Catalog and schema support
247
+ SQL_CATALOG_TERM = 42
248
+ SQL_CATALOG_NAME_SEPARATOR = 41
249
+ SQL_SCHEMA_TERM = 39
250
+ SQL_TABLE_TERM = 45
251
+ SQL_PROCEDURES = 21
252
+ SQL_ACCESSIBLE_TABLES = 19
253
+ SQL_ACCESSIBLE_PROCEDURES = 20
254
+ SQL_CATALOG_NAME = 10003
255
+ SQL_CATALOG_USAGE = 92
256
+ SQL_SCHEMA_USAGE = 91
257
+ SQL_COLUMN_ALIAS = 87
258
+ SQL_DESCRIBE_PARAMETER = 10002
259
+
260
+ # Transaction support
261
+ SQL_TXN_CAPABLE = 46
262
+ SQL_TXN_ISOLATION_OPTION = 72
263
+ SQL_DEFAULT_TXN_ISOLATION = 26
264
+ SQL_MULTIPLE_ACTIVE_TXN = 37
265
+
266
+ # Data type support
267
+ SQL_NUMERIC_FUNCTIONS = 49
268
+ SQL_STRING_FUNCTIONS = 50
269
+ SQL_DATETIME_FUNCTIONS = 52
270
+ SQL_TIMEDATE_FUNCTIONS = SQL_DATETIME_FUNCTIONS
271
+ SQL_SYSTEM_FUNCTIONS = 51
272
+ SQL_CONVERT_FUNCTIONS = 48
273
+ SQL_LIKE_ESCAPE_CLAUSE = 113
274
+
275
+ # Numeric limits
276
+ SQL_MAX_COLUMN_NAME_LEN = 30
277
+ SQL_MAX_TABLE_NAME_LEN = 35
278
+ SQL_MAX_SCHEMA_NAME_LEN = 32
279
+ SQL_MAX_CATALOG_NAME_LEN = 34
280
+ SQL_MAX_IDENTIFIER_LEN = 10005
281
+ SQL_MAX_STATEMENT_LEN = 105
282
+ SQL_MAX_CHAR_LITERAL_LEN = 108
283
+ SQL_MAX_BINARY_LITERAL_LEN = 112
284
+ SQL_MAX_COLUMNS_IN_TABLE = 101
285
+ SQL_MAX_COLUMNS_IN_SELECT = 100
286
+ SQL_MAX_COLUMNS_IN_GROUP_BY = 97
287
+ SQL_MAX_COLUMNS_IN_ORDER_BY = 99
288
+ SQL_MAX_COLUMNS_IN_INDEX = 98
289
+ SQL_MAX_TABLES_IN_SELECT = 106
290
+ SQL_MAX_CONCURRENT_ACTIVITIES = 1
291
+ SQL_MAX_DRIVER_CONNECTIONS = 0
292
+ SQL_MAX_ROW_SIZE = 104
293
+ SQL_MAX_USER_NAME_LEN = 107
294
+
295
+ # Connection information and legacy information-type aliases
296
+ SQL_ACTIVE_CONNECTIONS = 0
297
+ SQL_ACTIVE_STATEMENTS = 1
298
+ SQL_DATA_SOURCE_READ_ONLY = 25
299
+ SQL_NEED_LONG_DATA_LEN = 111
300
+ SQL_GETDATA_EXTENSIONS = 81
301
+
302
+ # Result set and cursor attributes
303
+ SQL_CURSOR_COMMIT_BEHAVIOR = 23
304
+ SQL_CURSOR_ROLLBACK_BEHAVIOR = 24
305
+ SQL_CURSOR_SENSITIVITY = 10001
306
+ SQL_BOOKMARK_PERSISTENCE = 82
307
+ SQL_DYNAMIC_CURSOR_ATTRIBUTES1 = 144
308
+ SQL_DYNAMIC_CURSOR_ATTRIBUTES2 = 145
309
+ SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES1 = 146
310
+ SQL_FORWARD_ONLY_CURSOR_ATTRIBUTES2 = 147
311
+ SQL_STATIC_CURSOR_ATTRIBUTES1 = 167
312
+ SQL_STATIC_CURSOR_ATTRIBUTES2 = 168
313
+ SQL_KEYSET_CURSOR_ATTRIBUTES1 = 150
314
+ SQL_KEYSET_CURSOR_ATTRIBUTES2 = 151
315
+ SQL_SCROLL_OPTIONS = 44
316
+ SQL_SCROLL_CONCURRENCY = 43
317
+ SQL_FETCH_DIRECTION = 8
318
+ SQL_STATIC_SENSITIVITY = 83
319
+ SQL_BATCH_SUPPORT = 121
320
+ SQL_BATCH_ROW_COUNT = 120
321
+ SQL_PARAM_ARRAY_ROW_COUNTS = 153
322
+ SQL_PARAM_ARRAY_SELECTS = 154
323
+ SQL_PROCEDURE_TERM = 40
324
+
325
+ # Positioned statement support
326
+ SQL_POSITIONED_STATEMENTS = 80
327
+
328
+ # Other constants
329
+ SQL_GROUP_BY = 88
330
+ SQL_OJ_CAPABILITIES = 115
331
+ SQL_ORDER_BY_COLUMNS_IN_SELECT = 90
332
+ SQL_OUTER_JOINS = 38
333
+ SQL_QUOTED_IDENTIFIER_CASE = 93
334
+ SQL_CONCAT_NULL_BEHAVIOR = 22
335
+ SQL_NULL_COLLATION = 85
336
+ SQL_ALTER_TABLE = 86
337
+ SQL_UNION = 96
338
+ SQL_DDL_INDEX = 170
339
+ SQL_MULT_RESULT_SETS = 36
340
+ SQL_OWNER_USAGE = 91
341
+ SQL_QUALIFIER_USAGE = 92
342
+ SQL_TIMEDATE_ADD_INTERVALS = 109
343
+ SQL_TIMEDATE_DIFF_INTERVALS = 110
344
+
345
+ # Deprecated non-information names retained for compatibility throughout 1.x.
346
+ SQL_TXN_ISOLATION_LEVEL = ConstantsDDBC.SQL_TXN_ISOLATION_LEVEL.value
347
+ SQL_CONCURRENCY = ConstantsDDBC.SQL_CONCURRENCY.value
348
+ SQL_ROWSET_SIZE = ConstantsDDBC.SQL_ROWSET_SIZE.value
349
+ SQL_ROW_NUMBER = ConstantsDDBC.SQL_ROW_NUMBER.value
350
+ SQL_IC_UPPER = ConstantsDDBC.SQL_IC_UPPER.value
351
+ SQL_IC_LOWER = ConstantsDDBC.SQL_IC_LOWER.value
352
+ SQL_IC_SENSITIVE = ConstantsDDBC.SQL_IC_SENSITIVE.value
353
+ SQL_IC_MIXED = ConstantsDDBC.SQL_IC_MIXED.value
354
+ SQL_SQL92_ENTRY_SQL = ConstantsDDBC.SQL_SQL92_ENTRY_SQL.value
355
+ SQL_SQL92_INTERMEDIATE_SQL = ConstantsDDBC.SQL_SQL92_INTERMEDIATE_SQL.value
356
+ SQL_SQL92_FULL_SQL = ConstantsDDBC.SQL_SQL92_FULL_SQL.value
357
+
358
+
359
+ class AuthType(Enum):
360
+ """Constants for authentication types (public/ODBC connection-string form)."""
361
+
362
+ INTERACTIVE = "activedirectoryinteractive"
363
+ DEVICE_CODE = "activedirectorydevicecode"
364
+ DEFAULT = "activedirectorydefault"
365
+ MSI = "activedirectorymsi"
366
+ SERVICE_PRINCIPAL = "activedirectoryserviceprincipal"
367
+
368
+
369
+ class _AuthInternal:
370
+ """Internal short-form auth identifiers used after normalization.
371
+
372
+ Paired with :class:`AuthType` (the public ODBC-string form) by
373
+ ``mssql_python.auth._AUTH_TYPE_MAP``. Adding a new auth mode requires
374
+ one entry here, one in ``AuthType``, and one in ``_AUTH_TYPE_MAP``.
375
+ """
376
+
377
+ DEFAULT = "default"
378
+ DEVICE_CODE = "devicecode"
379
+ INTERACTIVE = "interactive"
380
+ MSI = "msi"
381
+ SERVICE_PRINCIPAL = "serviceprincipal"
382
+
383
+
384
+ class SQLTypes:
385
+ """Constants for valid SQL data types to use with setinputsizes"""
386
+
387
+ @classmethod
388
+ def get_valid_types(cls) -> set:
389
+ """Returns a set of all valid SQL type constants"""
390
+
391
+ return {
392
+ ConstantsDDBC.SQL_CHAR.value,
393
+ ConstantsDDBC.SQL_VARCHAR.value,
394
+ ConstantsDDBC.SQL_LONGVARCHAR.value,
395
+ ConstantsDDBC.SQL_WCHAR.value,
396
+ ConstantsDDBC.SQL_WVARCHAR.value,
397
+ ConstantsDDBC.SQL_WLONGVARCHAR.value,
398
+ ConstantsDDBC.SQL_DECIMAL.value,
399
+ ConstantsDDBC.SQL_NUMERIC.value,
400
+ ConstantsDDBC.SQL_BIT.value,
401
+ ConstantsDDBC.SQL_TINYINT.value,
402
+ ConstantsDDBC.SQL_SMALLINT.value,
403
+ ConstantsDDBC.SQL_INTEGER.value,
404
+ ConstantsDDBC.SQL_BIGINT.value,
405
+ ConstantsDDBC.SQL_REAL.value,
406
+ ConstantsDDBC.SQL_FLOAT.value,
407
+ ConstantsDDBC.SQL_DOUBLE.value,
408
+ ConstantsDDBC.SQL_BINARY.value,
409
+ ConstantsDDBC.SQL_VARBINARY.value,
410
+ ConstantsDDBC.SQL_LONGVARBINARY.value,
411
+ ConstantsDDBC.SQL_DATE.value,
412
+ ConstantsDDBC.SQL_TIME.value,
413
+ ConstantsDDBC.SQL_TIMESTAMP.value,
414
+ ConstantsDDBC.SQL_TYPE_DATE.value,
415
+ ConstantsDDBC.SQL_TYPE_TIME.value,
416
+ ConstantsDDBC.SQL_TYPE_TIMESTAMP.value,
417
+ ConstantsDDBC.SQL_SS_TIME2.value,
418
+ ConstantsDDBC.SQL_DATETIMEOFFSET.value,
419
+ ConstantsDDBC.SQL_SS_XML.value,
420
+ ConstantsDDBC.SQL_GUID.value,
421
+ ConstantsDDBC.SQL_SS_UDT.value,
422
+ ConstantsDDBC.SQL_SS_VARIANT.value,
423
+ }
424
+
425
+ # Could also add category methods for convenience
426
+ @classmethod
427
+ def get_string_types(cls) -> set:
428
+ """Returns a set of string SQL type constants"""
429
+
430
+ return {
431
+ ConstantsDDBC.SQL_CHAR.value,
432
+ ConstantsDDBC.SQL_VARCHAR.value,
433
+ ConstantsDDBC.SQL_LONGVARCHAR.value,
434
+ ConstantsDDBC.SQL_WCHAR.value,
435
+ ConstantsDDBC.SQL_WVARCHAR.value,
436
+ ConstantsDDBC.SQL_WLONGVARCHAR.value,
437
+ }
438
+
439
+ @classmethod
440
+ def get_numeric_types(cls) -> set:
441
+ """Returns a set of numeric SQL type constants"""
442
+
443
+ return {
444
+ ConstantsDDBC.SQL_DECIMAL.value,
445
+ ConstantsDDBC.SQL_NUMERIC.value,
446
+ ConstantsDDBC.SQL_BIT.value,
447
+ ConstantsDDBC.SQL_TINYINT.value,
448
+ ConstantsDDBC.SQL_SMALLINT.value,
449
+ ConstantsDDBC.SQL_INTEGER.value,
450
+ ConstantsDDBC.SQL_BIGINT.value,
451
+ ConstantsDDBC.SQL_REAL.value,
452
+ ConstantsDDBC.SQL_FLOAT.value,
453
+ ConstantsDDBC.SQL_DOUBLE.value,
454
+ }
455
+
456
+
457
+ class AttributeSetTime(Enum):
458
+ """
459
+ Defines when connection attributes can be set in relation to connection establishment.
460
+
461
+ This enum is used to validate if a specific connection attribute can be set before
462
+ connection, after connection, or at either time.
463
+ """
464
+
465
+ BEFORE_ONLY = 1 # Must be set before connection is established
466
+ AFTER_ONLY = 2 # Can only be set after connection is established
467
+ EITHER = 3 # Can be set either before or after connection
468
+
469
+
470
+ # Dictionary mapping attributes to their valid set times
471
+ ATTRIBUTE_SET_TIMING = {
472
+ # Must be set before connection
473
+ ConstantsDDBC.SQL_ATTR_LOGIN_TIMEOUT.value: AttributeSetTime.BEFORE_ONLY,
474
+ ConstantsDDBC.SQL_ATTR_ODBC_CURSORS.value: AttributeSetTime.BEFORE_ONLY,
475
+ ConstantsDDBC.SQL_ATTR_PACKET_SIZE.value: AttributeSetTime.BEFORE_ONLY,
476
+ # Can only be set after connection
477
+ ConstantsDDBC.SQL_ATTR_CONNECTION_DEAD.value: AttributeSetTime.AFTER_ONLY,
478
+ ConstantsDDBC.SQL_ATTR_ENLIST_IN_DTC.value: AttributeSetTime.AFTER_ONLY,
479
+ ConstantsDDBC.SQL_ATTR_TRANSLATE_LIB.value: AttributeSetTime.AFTER_ONLY,
480
+ ConstantsDDBC.SQL_ATTR_TRANSLATE_OPTION.value: AttributeSetTime.AFTER_ONLY,
481
+ # Can be set either before or after connection
482
+ ConstantsDDBC.SQL_ATTR_ACCESS_MODE.value: AttributeSetTime.EITHER,
483
+ ConstantsDDBC.SQL_ATTR_ASYNC_DBC_EVENT.value: AttributeSetTime.EITHER,
484
+ ConstantsDDBC.SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE.value: AttributeSetTime.EITHER,
485
+ ConstantsDDBC.SQL_ATTR_ASYNC_ENABLE.value: AttributeSetTime.EITHER,
486
+ ConstantsDDBC.SQL_ATTR_AUTOCOMMIT.value: AttributeSetTime.EITHER,
487
+ ConstantsDDBC.SQL_ATTR_CONNECTION_TIMEOUT.value: AttributeSetTime.EITHER,
488
+ ConstantsDDBC.SQL_ATTR_CURRENT_CATALOG.value: AttributeSetTime.EITHER,
489
+ ConstantsDDBC.SQL_ATTR_QUIET_MODE.value: AttributeSetTime.EITHER,
490
+ ConstantsDDBC.SQL_ATTR_TRACE.value: AttributeSetTime.EITHER,
491
+ ConstantsDDBC.SQL_ATTR_TRACEFILE.value: AttributeSetTime.EITHER,
492
+ ConstantsDDBC.SQL_ATTR_TXN_ISOLATION.value: AttributeSetTime.EITHER,
493
+ }
494
+
495
+
496
+ def get_attribute_set_timing(attribute):
497
+ """
498
+ Get when an attribute can be set (before connection, after, or either).
499
+
500
+ Args:
501
+ attribute (int): The connection attribute (SQL_ATTR_*)
502
+
503
+ Returns:
504
+ AttributeSetTime: When the attribute can be set
505
+ """
506
+ return ATTRIBUTE_SET_TIMING.get(attribute, AttributeSetTime.AFTER_ONLY)
507
+
508
+
509
+ _CONNECTION_STRING_DRIVER_KEY = "Driver"
510
+ _CONNECTION_STRING_APP_KEY = "APP"
511
+ _CONNECTION_STRING_AUTH_KEY = "Authentication"
512
+ _CONNECTION_STRING_UID_KEY = "UID"
513
+ _CONNECTION_STRING_PWD_KEY = "PWD"
514
+ _CONNECTION_STRING_TRUSTED_CONNECTION_KEY = "Trusted_Connection"
515
+
516
+ # Aliases used by auth.py / connection.py — kept for readability.
517
+ _KEY_AUTHENTICATION = _CONNECTION_STRING_AUTH_KEY
518
+ _KEY_UID = _CONNECTION_STRING_UID_KEY
519
+ _KEY_PWD = _CONNECTION_STRING_PWD_KEY
520
+ _KEY_TRUSTED_CONNECTION = _CONNECTION_STRING_TRUSTED_CONNECTION_KEY
521
+
522
+ # Reserved connection string parameters that are controlled by the driver
523
+ # and cannot be set by users
524
+ _RESERVED_PARAMETERS = (_CONNECTION_STRING_DRIVER_KEY, _CONNECTION_STRING_APP_KEY)
525
+
526
+ # Core connection parameters with synonym mapping
527
+ # Maps lowercase parameter names to their canonical form
528
+ # Based on ODBC Driver 18 for SQL Server supported parameters
529
+ # A new connection string key to be supported in Python, should be added
530
+ # to the dictionary below. the value is the canonical name used in the
531
+ # final connection string sent to ODBC driver.
532
+ # The left side is what Python connection string supports, the right side
533
+ # is the canonical ODBC key name.
534
+ _ALLOWED_CONNECTION_STRING_PARAMS = {
535
+ # Server identification - addr, address, and server are synonyms
536
+ "server": "Server",
537
+ "address": "Server",
538
+ "addr": "Server",
539
+ # Authentication
540
+ "uid": _CONNECTION_STRING_UID_KEY,
541
+ "pwd": _CONNECTION_STRING_PWD_KEY,
542
+ "authentication": _CONNECTION_STRING_AUTH_KEY,
543
+ "trusted_connection": _CONNECTION_STRING_TRUSTED_CONNECTION_KEY,
544
+ # Database
545
+ "database": "Database",
546
+ # Driver (always controlled by mssql-python)
547
+ "driver": _CONNECTION_STRING_DRIVER_KEY,
548
+ # Application name (always controlled by mssql-python)
549
+ "app": _CONNECTION_STRING_APP_KEY,
550
+ # Encryption and Security
551
+ "encrypt": "Encrypt",
552
+ "trustservercertificate": "TrustServerCertificate",
553
+ "trust_server_certificate": "TrustServerCertificate", # Snake_case synonym
554
+ "hostnameincertificate": "HostnameInCertificate", # v18.0+
555
+ "servercertificate": "ServerCertificate", # v18.1+
556
+ "serverspn": "ServerSPN",
557
+ # Connection behavior
558
+ "multisubnetfailover": "MultiSubnetFailover",
559
+ "applicationintent": "ApplicationIntent",
560
+ "connectretrycount": "ConnectRetryCount",
561
+ "connectretryinterval": "ConnectRetryInterval",
562
+ # Keep-Alive (v17.4+)
563
+ "keepalive": "KeepAlive",
564
+ "keepaliveinterval": "KeepAliveInterval",
565
+ # IP Address Preference (v18.1+)
566
+ "ipaddresspreference": "IpAddressPreference",
567
+ "packet size": "PacketSize", # From the tests it looks like pyodbc users use Packet Size
568
+ # (with spaces) ODBC only honors "PacketSize" without spaces
569
+ # internally.
570
+ "packetsize": "PacketSize",
571
+ }
572
+
573
+
574
+ def get_info_constants() -> Dict[str, int]:
575
+ """
576
+ Return all GetInfoConstants names and values, including deprecated members.
577
+
578
+ Deprecated compatibility names remain included throughout 1.x so existing
579
+ dictionary lookups keep working. They are not valid information-type names;
580
+ their inclusion does not make them suitable inputs to Connection.getinfo().
581
+ See CHANGELOG.md for replacements and the deprecation policy.
582
+
583
+ Returns:
584
+ dict: Dictionary mapping constant names to their integer values
585
+ """
586
+ return {name: member.value for name, member in GetInfoConstants.__members__.items()}
587
+
588
+
589
+ # Automatically export selected enum constants as module-level attributes
590
+ # This allows: from mssql_python import SQL_VARCHAR
591
+ # Instead of: from mssql_python.constants import ConstantsDDBC; ConstantsDDBC.SQL_VARCHAR.value
592
+
593
+ # Define which ConstantsDDBC members should be exported as public API
594
+ # Internal/driver-manager-dependent constants are excluded
595
+ _DDBC_PUBLIC_API = {
596
+ # SQL Type constants
597
+ "SQL_CHAR",
598
+ "SQL_VARCHAR",
599
+ "SQL_LONGVARCHAR",
600
+ "SQL_WCHAR",
601
+ "SQL_WVARCHAR",
602
+ "SQL_WLONGVARCHAR",
603
+ "SQL_DECIMAL",
604
+ "SQL_NUMERIC",
605
+ "SQL_BIT",
606
+ "SQL_TINYINT",
607
+ "SQL_SMALLINT",
608
+ "SQL_INTEGER",
609
+ "SQL_BIGINT",
610
+ "SQL_REAL",
611
+ "SQL_FLOAT",
612
+ "SQL_DOUBLE",
613
+ "SQL_BINARY",
614
+ "SQL_VARBINARY",
615
+ "SQL_LONGVARBINARY",
616
+ "SQL_DATE",
617
+ "SQL_TIME",
618
+ "SQL_TIMESTAMP",
619
+ "SQL_TYPE_DATE",
620
+ "SQL_TYPE_TIME",
621
+ "SQL_TYPE_TIMESTAMP",
622
+ "SQL_GUID",
623
+ "SQL_XML",
624
+ # SQL Server-specific type constants (pyodbc parity)
625
+ "SQL_SS_TIME2",
626
+ "SQL_SS_XML",
627
+ "SQL_SS_VARIANT",
628
+ # Connection attribute constants (ODBC-standard, driver-independent only)
629
+ "SQL_ATTR_ACCESS_MODE",
630
+ "SQL_ATTR_CONNECTION_TIMEOUT",
631
+ "SQL_ATTR_CURRENT_CATALOG",
632
+ "SQL_ATTR_LOGIN_TIMEOUT",
633
+ "SQL_ATTR_PACKET_SIZE",
634
+ "SQL_ATTR_TXN_ISOLATION",
635
+ "SQL_TXN_ISOLATION_LEVEL",
636
+ # Legacy statement options
637
+ "SQL_CONCURRENCY",
638
+ "SQL_ROWSET_SIZE",
639
+ "SQL_ROW_NUMBER",
640
+ # SQLGetInfo return values and compatibility spellings
641
+ "SQL_IC_UPPER",
642
+ "SQL_IC_LOWER",
643
+ "SQL_IC_SENSITIVE",
644
+ "SQL_IC_MIXED",
645
+ "SQL_SC_SQL92_ENTRY",
646
+ "SQL_SC_FIPS127_2_TRANSITIONAL",
647
+ "SQL_SC_SQL92_INTERMEDIATE",
648
+ "SQL_SC_SQL92_FULL",
649
+ "SQL_SQL92_ENTRY_SQL",
650
+ "SQL_SQL92_INTERMEDIATE_SQL",
651
+ "SQL_SQL92_FULL_SQL",
652
+ # Transaction isolation levels
653
+ "SQL_TXN_READ_UNCOMMITTED",
654
+ "SQL_TXN_READ_COMMITTED",
655
+ "SQL_TXN_REPEATABLE_READ",
656
+ "SQL_TXN_SERIALIZABLE",
657
+ # Access modes
658
+ "SQL_MODE_READ_WRITE",
659
+ "SQL_MODE_READ_ONLY",
660
+ }
661
+
662
+ # Get current module's globals for dynamic export
663
+ _module_globals = globals()
664
+ _exported_names = []
665
+
666
+ # Export selected ConstantsDDBC enum members as module-level constants
667
+ for _name, _member in ConstantsDDBC.__members__.items():
668
+ if _name in _DDBC_PUBLIC_API:
669
+ _module_globals[_name] = _member.value
670
+ _exported_names.append(_name)
671
+
672
+ # Export GetInfoConstants members not already exported from ConstantsDDBC.
673
+ for _name, _member in GetInfoConstants.__members__.items():
674
+ if _name not in _DDBC_PUBLIC_API:
675
+ _module_globals[_name] = _member.value
676
+ _exported_names.append(_name)
677
+
678
+ # AuthType enum is exported as a class only (not individual members)
679
+ # to avoid polluting the namespace with generic names like DEFAULT
680
+
681
+ # SQLTypes is not an Enum, it's a regular class - don't iterate it
682
+
683
+ # Add special constant not in enum
684
+ SQL_WMETADATA: int = -99
685
+ _exported_names.append("SQL_WMETADATA")
686
+
687
+ # Define __all__ for controlled exports
688
+ __all__ = [
689
+ # Enum classes themselves
690
+ "ConstantsDDBC",
691
+ "GetInfoConstants",
692
+ "AuthType",
693
+ "SQLTypes",
694
+ # Helper function
695
+ "get_info_constants",
696
+ # All dynamically exported constants
697
+ *_exported_names,
698
+ ]
699
+
700
+ # Clean up temporary variables
701
+ del _module_globals, _exported_names, _name, _member