Skip to content

Conversation

@bhatt4982
Copy link
Contributor

No description provided.

@bhatt4982 bhatt4982 requested a review from a team as a code owner December 1, 2025 11:13
@gemini-code-assist
Copy link

Summary of Changes

Hello @bhatt4982, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request lays the groundwork for a high-performance Python wrapper for the Go Spanner client shared library. It establishes the core Python classes for managing database connections and pools, sets up the necessary interoperability with the Go library, and introduces a comprehensive build and testing infrastructure to ensure reliability and maintainability.

Highlights

  • New Python Wrapper Structure: Introduced the foundational project structure for the spannerlib-python wrapper, including google/cloud/spannerlib for core components, tests for unit and system tests, and samples.
  • Connection and Pool Classes: Added the Connection class to represent a single Spanner database connection and the Pool class to manage a pool of these connections, both inheriting from a new AbstractLibraryObject for resource management.
  • Go Library Interoperability: Implemented SpannerLib as a singleton to load and interact with the underlying Go shared library using ctypes, defining structures like Message, GoString, and GoSlice for seamless data exchange and error handling.
  • Comprehensive Testing and Build Setup: Configured nox for automated formatting, linting, unit, and system tests. A build-shared-lib.sh script was added to compile and copy platform-specific Go binaries, and pyproject.toml was set up for package building.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the initial structure for the spannerlib-python wrapper, including the core classes Connection and Pool, FFI bindings, and a comprehensive set of unit and system tests. The overall structure is well-designed, with good use of abstract base classes, protocols for type safety, and context managers for resource management. The FFI layer is carefully implemented with attention to memory safety. The tests are thorough and cover many edge cases. My review includes a few suggestions to improve logging practices, exception handling consistency, and script portability.

@bhatt4982
Copy link
Contributor Author

/gemini review

Copy link

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request introduces the initial structure for the spannerlib-python wrapper, including the core Connection and Pool classes, FFI bindings, and a comprehensive test suite. The overall design is robust, with excellent attention to resource management and error handling. I've identified one critical issue related to loading the shared library that could cause failures when the package is installed from a wheel, and a few medium-severity suggestions to improve maintainability, consistency, and documentation. Great work on setting up a solid foundation for the project!

@bhatt4982 bhatt4982 changed the base branch from main to psd-03-pool December 3, 2025 13:40
…ecuteBatch and WriteMutation methods and relevant tests... (#660)

* feat: Introduce `Rows` class and add `execute`, `execute_batch`, and `write_mutations` methods to `Connection`.

* feat: Add SQL execution, batch DML, and mutation writing methods to Connection and expose Rows object.

* Chore: Python-Spanner-Driver - Added Rows class, its methods and relevant tests... (#661)

* test: add system tests for query, batch DML, and mutation operations, including emulator setup.

* feat: Add `next()`, `metadata()`, `result_set_stats()`, and `update_count()` methods to the `Rows` class for fetching data and statistics, including unit tests.

* test: Add system tests for `Rows` class covering metadata, stats, update count, and row iteration.

* Chore: Python-Spanner-Driver - Added transaction functions in Connection class and relevant tests... (#662)

* feat: Add transaction management with `begin_transaction`, `commit`, and `rollback` methods and their respective tests.

* feat: add system and unit tests for transaction mutation writes, including commit and rollback scenarios.

* feat: `update_count`  returns -1 instead of 0 when row count stats are unavailable and updates the corresponding test.

* refactor: remove direct Pool argument from Rows constructor and access via Connection.

* feat: Add `IF NOT EXISTS` to `CREATE TABLE` and `IF EXISTS` to `DROP TABLE` statements, removing explicit exception handling.

* feat: `write_mutations` now returns `None` for buffered mutations, updating its return type and related tests.
@bhatt4982 bhatt4982 merged commit 0a6c943 into psd-03-pool Dec 4, 2025
24 of 28 checks passed
@bhatt4982 bhatt4982 deleted the psd-04-conn branch December 4, 2025 13:48
bhatt4982 added a commit that referenced this pull request Dec 4, 2025
…and relevant tests (#658)

* feat: Introduce AbstractLibraryObject and Pool modules with their unit and system tests, replacing placeholder tests.

* Chore: Python-Spanner-Driver - Added Connection class and relevant tests (#659)

* feat: introduce Connection class and enable Pool to create and manage connections

* Chore: Python-Spanner-Driver | Spannerlib Wrapper | Added Execute, ExecuteBatch and WriteMutation methods and relevant tests... (#660)

* feat: Introduce `Rows` class and add `execute`, `execute_batch`, and `write_mutations` methods to `Connection`.

* feat: Add SQL execution, batch DML, and mutation writing methods to Connection and expose Rows object.

* Chore: Python-Spanner-Driver - Added Rows class, its methods and relevant tests... (#661)

* test: add system tests for query, batch DML, and mutation operations, including emulator setup.

* feat: Add `next()`, `metadata()`, `result_set_stats()`, and `update_count()` methods to the `Rows` class for fetching data and statistics, including unit tests.

* test: Add system tests for `Rows` class covering metadata, stats, update count, and row iteration.

* Chore: Python-Spanner-Driver - Added transaction functions in Connection class and relevant tests... (#662)

* feat: Add transaction management with `begin_transaction`, `commit`, and `rollback` methods and their respective tests.

* feat: add system and unit tests for transaction mutation writes, including commit and rollback scenarios.

* feat: `update_count`  returns -1 instead of 0 when row count stats are unavailable and updates the corresponding test.

* refactor: remove direct Pool argument from Rows constructor and access via Connection.

* feat: Add `IF NOT EXISTS` to `CREATE TABLE` and `IF EXISTS` to `DROP TABLE` statements, removing explicit exception handling.

* feat: `write_mutations` now returns `None` for buffered mutations, updating its return type and related tests.
bhatt4982 added a commit that referenced this pull request Dec 4, 2025
…dle spannerlib library interaction (#657)

* feat: Add initial Python wrapper for Spanner library,
including internal message structures, error handling,
and a protocol definition.

* refactor: Introduce `_load_library` for library initialization, remove `_get_lib_path`, and update related tests.

* Chore: Python-Spanner-Driver | Spannerlib Wrapper | Added Pool class and relevant tests (#658)

* feat: Introduce AbstractLibraryObject and Pool modules with their unit and system tests, replacing placeholder tests.

* Chore: Python-Spanner-Driver - Added Connection class and relevant tests (#659)

* feat: introduce Connection class and enable Pool to create and manage connections

* Chore: Python-Spanner-Driver | Spannerlib Wrapper | Added Execute, ExecuteBatch and WriteMutation methods and relevant tests... (#660)

* feat: Introduce `Rows` class and add `execute`, `execute_batch`, and `write_mutations` methods to `Connection`.

* feat: Add SQL execution, batch DML, and mutation writing methods to Connection and expose Rows object.

* Chore: Python-Spanner-Driver - Added Rows class, its methods and relevant tests... (#661)

* test: add system tests for query, batch DML, and mutation operations, including emulator setup.

* feat: Add `next()`, `metadata()`, `result_set_stats()`, and `update_count()` methods to the `Rows` class for fetching data and statistics, including unit tests.

* test: Add system tests for `Rows` class covering metadata, stats, update count, and row iteration.

* Chore: Python-Spanner-Driver - Added transaction functions in Connection class and relevant tests... (#662)

* feat: Add transaction management with `begin_transaction`, `commit`, and `rollback` methods and their respective tests.

* feat: add system and unit tests for transaction mutation writes, including commit and rollback scenarios.

* feat: `update_count`  returns -1 instead of 0 when row count stats are unavailable and updates the corresponding test.

* refactor: remove direct Pool argument from Rows constructor and access via Connection.

* feat: Add `IF NOT EXISTS` to `CREATE TABLE` and `IF EXISTS` to `DROP TABLE` statements, removing explicit exception handling.

* feat: `write_mutations` now returns `None` for buffered mutations, updating its return type and related tests.

* Update spannerlib/wrappers/spannerlib-python/spannerlib-python/google/cloud/spannerlib/internal/message.py

Co-authored-by: Knut Olav Løite <koloite@gmail.com>

* feat: Remove Python 3.8 fallback for `importlib.resources` and few docstring update

* feat: Enhance SpannerLibError messages to include gRPC status names and add corresponding tests.

* test: update SpannerLibError repr test message and code values

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: Knut Olav Løite <koloite@gmail.com>
bhatt4982 added a commit that referenced this pull request Dec 4, 2025
* chore: Create setup for SpannerLib-Python project

* Chore: Python-Spanner-Driver | Spannerlib Wrapper | Added code to handle spannerlib library interaction (#657)

* feat: Add initial Python wrapper for Spanner library,
including internal message structures, error handling,
and a protocol definition.

* Chore: Python-Spanner-Driver | Spannerlib Wrapper | Added Pool class and relevant tests (#658)

* feat: Introduce AbstractLibraryObject and Pool modules with their unit and system tests, replacing placeholder tests.

* Chore: Python-Spanner-Driver - Added Connection class and relevant tests (#659)

* feat: introduce Connection class and enable Pool to create and manage connections

* Chore: Python-Spanner-Driver | Spannerlib Wrapper | Added Execute, ExecuteBatch and WriteMutation methods and relevant tests... (#660)

* feat: Introduce `Rows` class and add `execute`, `execute_batch`, and `write_mutations` methods to `Connection`.

* feat: Add SQL execution, batch DML, and mutation writing methods to Connection and expose Rows object.

* Chore: Python-Spanner-Driver - Added Rows class, its methods and relevant tests... (#661)

* test: add system tests for query, batch DML, and mutation operations, including emulator setup.

* feat: Add `next()`, `metadata()`, `result_set_stats()`, and `update_count()` methods to the `Rows` class for fetching data and statistics, including unit tests.

* test: Add system tests for `Rows` class covering metadata, stats, update count, and row iteration.

* Chore: Python-Spanner-Driver - Added transaction functions in Connection class and relevant tests... (#662)

* feat: Add transaction management with `begin_transaction`, `commit`, and `rollback` methods and their respective tests.

* feat: add system and unit tests for transaction mutation writes, including commit and rollback scenarios.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants