Skip to content

FIX: forward connection timeout to bulkcopy pycore connection#650

Draft
bewithgaurav wants to merge 2 commits into
mainfrom
bewithgaurav/fix-626-bulkcopy-connect-timeout
Draft

FIX: forward connection timeout to bulkcopy pycore connection#650
bewithgaurav wants to merge 2 commits into
mainfrom
bewithgaurav/fix-626-bulkcopy-connect-timeout

Conversation

@bewithgaurav

Copy link
Copy Markdown
Collaborator

Work Item / Issue Reference

GitHub Issue: #626


Summary

cursor.bulkcopy() opens a separate connection through mssql-py-core, which defaulted to a hardcoded 15s connect timeout with no way to override it from Python. I forward the cursor's query timeout (set via connect(timeout=X)) into pycore's connect_timeout when it's set, so the bulk copy connection honors the same limit. timeout=0 stays a no-override, leaving pycore on its 15s default. added tests covering the positive forward, the zero case, and that the cursor snapshot (not a later live connection change) is what's used.

cursor.bulkcopy() opens a separate connection through mssql-py-core, which defaulted to a hardcoded 15s connect timeout with no way to override it. forward the cursor's query timeout (connect(timeout=X)) into pycore's connect_timeout when set, so the same limit applies to the bulk copy connection. 0 stays a no-override, leaving pycore on its default.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions github-actions Bot added the pr-size: small Minimal code update label Jun 29, 2026
def test_positive_timeout_forwarded(self, mock_logger):
"""cursor._timeout > 0 ⇒ connect_timeout reaches pycore, overriding 15s."""
mock_logger.is_debug_enabled = False
cursor = _make_cursor("Server=localhost;Database=testdb;UID=sa;PWD=pwd", None)
def test_zero_timeout_not_forwarded(self, mock_logger):
"""cursor._timeout == 0 ⇒ no override, pycore keeps its default."""
mock_logger.is_debug_enabled = False
cursor = _make_cursor("Server=localhost;Database=testdb;UID=sa;PWD=pwd", None)
def test_uses_cursor_snapshot_not_live_connection(self, mock_logger):
"""timeout is the cursor snapshot; later connection changes don't apply."""
mock_logger.is_debug_enabled = False
cursor = _make_cursor("Server=localhost;Database=testdb;UID=sa;PWD=pwd", None)
the msi-client-id bulkcopy regression test builds a Cursor via __new__ without _timeout. _bulkcopy now reads self._timeout to forward connect_timeout (issue #626), so the bare mock raised AttributeError. set _timeout=0 to match a real cursor, same as the other bulkcopy mocks.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@github-actions

Copy link
Copy Markdown

📊 Code Coverage Report

🔥 Diff Coverage

100%


🎯 Overall Coverage

80%


📈 Total Lines Covered: 6731 out of 8310
📁 Project: mssql-python


Diff Coverage

Diff: main...HEAD, staged and unstaged changes

No lines with coverage information in this diff.


📋 Files Needing Attention

📉 Files with overall lowest coverage (click to expand)
mssql_python.pybind.logger_bridge.cpp: 59.2%
mssql_python.pybind.ddbc_bindings.h: 59.9%
mssql_python.pybind.logger_bridge.hpp: 70.8%
mssql_python.pybind.connection.connection.cpp: 76.2%
mssql_python.pybind.ddbc_bindings.cpp: 76.4%
mssql_python.row.py: 76.9%
mssql_python.__init__.py: 77.3%
mssql_python.ddbc_bindings.py: 79.6%
mssql_python.logging.py: 85.5%
mssql_python.connection.py: 85.6%

🔗 Quick Links

⚙️ Build Summary 📋 Coverage Details

View Azure DevOps Build

Browse Full Coverage Report

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-size: small Minimal code update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants