Skip to content

Conversation

@jahnvi480
Copy link
Contributor

@jahnvi480 jahnvi480 commented Aug 22, 2025

Work Item / Issue Reference

AB#34931


Summary

This pull request adds support for retrieving primary key information from database tables using a new primaryKeys method on the cursor object. It introduces the necessary C++/ODBC bindings, Python method, and a comprehensive set of tests to validate the new functionality.

Primary Key Metadata Support

  • Added a primaryKeys method to the cursor class in cursor.py to allow users to retrieve primary key columns for a specified table, including support for catalog and schema filtering. The method handles ODBC API requirements and result formatting.

ODBC/C++ Binding Enhancements

  • Introduced the SQLPrimaryKeysFunc function pointer and associated logic in the C++ ODBC bindings (ddbc_bindings.cpp and ddbc_bindings.h), including function pointer loading, wrapper implementation, and Python module export, enabling Python to call the ODBC SQLPrimaryKeys API.

Testing Improvements

  • Added a suite of tests in test_004_cursor.py to verify the behavior of the new primaryKeys method, including setup and cleanup of test tables, validation for single and composite primary keys, column metadata correctness, handling of non-existent tables, and catalog filtering.

@github-actions github-actions bot added the pr-size: medium Moderate update size label Aug 22, 2025
@github-actions github-actions bot added pr-size: medium Moderate update size and removed pr-size: medium Moderate update size labels Sep 12, 2025
jahnvi480 and others added 2 commits September 15, 2025 10:08
### Work Item / Issue Reference  
<!-- 
IMPORTANT: Please follow the PR template guidelines below.
For mssql-python maintainers: Insert your ADO Work Item ID below (e.g.
AB#37452)
For external contributors: Insert Github Issue number below (e.g. #149)
Only one reference is required - either GitHub issue OR ADO Work Item.
-->

<!-- mssql-python maintainers: ADO Work Item -->
>
[AB#34929](https://sqlclientdrivers.visualstudio.com/c6d89619-62de-46a0-8b46-70b92a84d85e/_workitems/edit/34929)
>
[AB#34930](https://sqlclientdrivers.visualstudio.com/c6d89619-62de-46a0-8b46-70b92a84d85e/_workitems/edit/34930)

-------------------------------------------------------------------
### Summary   
This pull request adds support for retrieving special columns from a
database table using the ODBC `SQLSpecialColumns` function. The main
changes include new methods in the Python cursor for accessing row
identifier and version columns, as well as the necessary C++ and Python
bindings to expose this ODBC functionality. Additionally, relevant
constants have been added to support these features.

**New Python cursor methods:**

* Added `rowIdColumns` and `rowVerColumns` methods to the `Cursor` class
in `mssql_python/cursor.py`, allowing users to retrieve columns that
uniquely identify a row (`SQL_BEST_ROWID`) and columns that are
automatically updated when any value in the row is updated
(`SQL_ROWVER`). These methods handle ODBC parameter preparation, call
the new binding, and return results as row objects.

**ODBC and pybind11 binding support:**

* Defined the `SQLSpecialColumnsFunc` function pointer type and added
the corresponding global pointer in
`mssql_python/pybind/ddbc_bindings.h` and
`mssql_python/pybind/ddbc_bindings.cpp`.
* Loaded the `SQLSpecialColumnsW` symbol from the ODBC driver in the
driver loader, and included it in the function pointer validation check.
* Implemented the `SQLSpecialColumns_wrap` function to call the ODBC
API, handling both Unix and Windows string conversions, and exposed it
to Python as `DDBCSQLSpecialColumns` in the module definition.

**Constants:**

* Added new constants for `SQL_SCOPE_CURROW`, `SQL_BEST_ROWID`,
`SQL_ROWVER`, `SQL_NO_NULLS`, and `SQL_NULLABLE_UNKNOWN` to the
`ConstantsDDBC` enum in `mssql_python/constants.py` to support the new
functionality.

---------

Co-authored-by: Jahnvi Thakkar <[email protected]>
@github-actions github-actions bot added pr-size: large Substantial code update and removed pr-size: medium Moderate update size labels Sep 15, 2025
@jahnvi480 jahnvi480 merged commit ae56336 into jahnvi/cursor_foreignkey Sep 15, 2025
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

pr-size: large Substantial code update

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants