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.
- 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-amd64.pyd +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/msvcp140.dll +0 -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 +36 -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
|
@@ -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
|