Skip to content

Commit 9d8f37f

Browse files
committed
Resolving comments
1 parent 65d7876 commit 9d8f37f

File tree

5 files changed

+356
-105
lines changed

5 files changed

+356
-105
lines changed

mssql_python/__init__.py

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -53,29 +53,36 @@
5353
SQL_WMETADATA = -99
5454

5555
# Export connection attribute constants for set_attr()
56+
# NOTE: Some attributes are only supported when using an ODBC Driver Manager.
57+
# Attributes marked with [NO-OP] are not supported directly by the SQL Server ODBC driver
58+
# and will have no effect in this implementation.
59+
5660
SQL_ATTR_ACCESS_MODE = ConstantsDDBC.SQL_ATTR_ACCESS_MODE.value
5761
SQL_ATTR_AUTOCOMMIT = ConstantsDDBC.SQL_ATTR_AUTOCOMMIT.value
5862
SQL_ATTR_CONNECTION_TIMEOUT = ConstantsDDBC.SQL_ATTR_CONNECTION_TIMEOUT.value
5963
SQL_ATTR_CURRENT_CATALOG = ConstantsDDBC.SQL_ATTR_CURRENT_CATALOG.value
6064
SQL_ATTR_LOGIN_TIMEOUT = ConstantsDDBC.SQL_ATTR_LOGIN_TIMEOUT.value
6165
SQL_ATTR_ODBC_CURSORS = ConstantsDDBC.SQL_ATTR_ODBC_CURSORS.value
6266
SQL_ATTR_PACKET_SIZE = ConstantsDDBC.SQL_ATTR_PACKET_SIZE.value
63-
SQL_ATTR_QUIET_MODE = ConstantsDDBC.SQL_ATTR_QUIET_MODE.value
6467
SQL_ATTR_TXN_ISOLATION = ConstantsDDBC.SQL_ATTR_TXN_ISOLATION.value
65-
SQL_ATTR_TRACE = ConstantsDDBC.SQL_ATTR_TRACE.value
66-
SQL_ATTR_TRACEFILE = ConstantsDDBC.SQL_ATTR_TRACEFILE.value
67-
SQL_ATTR_TRANSLATE_LIB = ConstantsDDBC.SQL_ATTR_TRANSLATE_LIB.value
68-
SQL_ATTR_TRANSLATE_OPTION = ConstantsDDBC.SQL_ATTR_TRANSLATE_OPTION.value
69-
SQL_ATTR_CONNECTION_POOLING = ConstantsDDBC.SQL_ATTR_CONNECTION_POOLING.value
70-
SQL_ATTR_CP_MATCH = ConstantsDDBC.SQL_ATTR_CP_MATCH.value
71-
SQL_ATTR_ASYNC_ENABLE = ConstantsDDBC.SQL_ATTR_ASYNC_ENABLE.value
72-
SQL_ATTR_ENLIST_IN_DTC = ConstantsDDBC.SQL_ATTR_ENLIST_IN_DTC.value
73-
SQL_ATTR_ENLIST_IN_XA = ConstantsDDBC.SQL_ATTR_ENLIST_IN_XA.value
74-
SQL_ATTR_CONNECTION_DEAD = ConstantsDDBC.SQL_ATTR_CONNECTION_DEAD.value
75-
SQL_ATTR_SERVER_NAME = ConstantsDDBC.SQL_ATTR_SERVER_NAME.value
76-
SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE = ConstantsDDBC.SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE.value
77-
SQL_ATTR_ASYNC_DBC_EVENT = ConstantsDDBC.SQL_ATTR_ASYNC_DBC_EVENT.value
78-
SQL_ATTR_RESET_CONNECTION = ConstantsDDBC.SQL_ATTR_RESET_CONNECTION.value
68+
69+
# The following attributes are [NO-OP] in this implementation (require Driver Manager):
70+
# SQL_ATTR_QUIET_MODE
71+
# SQL_ATTR_TRACE
72+
# SQL_ATTR_TRACEFILE
73+
# SQL_ATTR_TRANSLATE_LIB
74+
# SQL_ATTR_TRANSLATE_OPTION
75+
# SQL_ATTR_CONNECTION_POOLING
76+
# SQL_ATTR_CP_MATCH
77+
# SQL_ATTR_ASYNC_ENABLE
78+
# SQL_ATTR_ENLIST_IN_DTC
79+
# SQL_ATTR_ENLIST_IN_XA
80+
# SQL_ATTR_CONNECTION_DEAD
81+
# SQL_ATTR_ASYNC_DBC_FUNCTIONS_ENABLE
82+
# SQL_ATTR_ASYNC_DBC_EVENT
83+
# SQL_ATTR_SERVER_NAME
84+
# SQL_ATTR_RESET_CONNECTION
85+
# SQL_RESET_CONNECTION_YES
7986

8087
# Transaction Isolation Level Constants
8188
SQL_TXN_READ_UNCOMMITTED = ConstantsDDBC.SQL_TXN_READ_UNCOMMITTED.value
@@ -87,17 +94,11 @@
8794
SQL_MODE_READ_WRITE = ConstantsDDBC.SQL_MODE_READ_WRITE.value
8895
SQL_MODE_READ_ONLY = ConstantsDDBC.SQL_MODE_READ_ONLY.value
8996

90-
# Connection Dead Constants
91-
SQL_CD_TRUE = ConstantsDDBC.SQL_CD_TRUE.value
92-
SQL_CD_FALSE = ConstantsDDBC.SQL_CD_FALSE.value
93-
9497
# ODBC Cursors Constants
9598
SQL_CUR_USE_IF_NEEDED = ConstantsDDBC.SQL_CUR_USE_IF_NEEDED.value
9699
SQL_CUR_USE_ODBC = ConstantsDDBC.SQL_CUR_USE_ODBC.value
97100
SQL_CUR_USE_DRIVER = ConstantsDDBC.SQL_CUR_USE_DRIVER.value
98101

99-
# Reset Connection Constants
100-
SQL_RESET_CONNECTION_YES = ConstantsDDBC.SQL_RESET_CONNECTION_YES.value
101102

102103
# GLOBALS
103104
# Read-Only

mssql_python/connection.py

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -544,30 +544,23 @@ def set_attr(self, attribute, value):
544544
Example:
545545
>>> conn.set_attr(SQL_ATTR_AUTOCOMMIT, SQL_AUTOCOMMIT_OFF)
546546
>>> conn.set_attr(SQL_ATTR_TXN_ISOLATION, SQL_TXN_READ_COMMITTED)
547-
548-
Note:
549-
This method is compatible with pyodbc's set_attr functionality.
550-
Attribute values must be within valid SQLUINTEGER range (0 to 4294967295).
551547
"""
552548
if self._closed:
553549
raise InterfaceError("Cannot set attribute on closed connection", "Connection is closed")
554550

555-
# Validate attribute type and range for SQLUINTEGER compatibility
551+
# Validate attribute type and range
556552
if not isinstance(attribute, int) or attribute < 0:
557553
raise ProgrammingError("Connection attribute must be a non-negative integer", f"Invalid attribute: {attribute}")
558554

559-
# Validate attribute is within SQLUINTEGER range
560-
if attribute > 4294967295: # 2^32 - 1
561-
raise ProgrammingError("Connection attribute must be within SQLUINTEGER range (0-4294967295)", f"Attribute out of range: {attribute}")
562-
563-
# Validate value type - must be integer, bytes, or bytearray
564-
if not isinstance(value, (int, bytes, bytearray)):
565-
raise ProgrammingError("Attribute value must be an integer, bytes, or bytearray", f"Invalid value type: {type(value)}")
555+
# Validate value type - must be integer, bytes, bytearray, or string
556+
if not isinstance(value, (int, bytes, bytearray, str)):
557+
raise ProgrammingError("Attribute value must be an integer, bytes, bytearray, or string",
558+
f"Invalid value type: {type(value)}")
566559

567-
# For integer values, validate SQLUINTEGER range
560+
# For integer values
568561
if isinstance(value, int):
569-
if value < 0 or value > 4294967295: # 2^32 - 1
570-
raise ProgrammingError("Attribute value out of range for SQLUINTEGER (0-4294967295)", f"Value out of range: {value}")
562+
if value < 0:
563+
raise ProgrammingError(f"Attribute value must be non-negative", f"Invalid value: {value}")
571564

572565
# Sanitize user input for security
573566
try:

0 commit comments

Comments
 (0)