Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

allow using multiple connections for CLI commands #3956

Merged
merged 1 commit into from
May 13, 2020

Conversation

dmaicher
Copy link
Contributor

Q A
Type feature
BC Break no
Fixed issues -

Summary

follow-up for #3892

This

  • adds a ConnectionProvider interface and a simple implementation for it
  • uses this provider in a backwards-compatible way for the console commands
  • deprecates the ConnectionHelper that was providing a single connection

@dmaicher
Copy link
Contributor Author

Actually this change would also affect doctrine/migrations and possibly doctrine/orm cli tools. They also use this console command helper approach

Copy link
Member

@morozov morozov left a comment

Choose a reason for hiding this comment

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

Looks good for the most part 👍 Just needs some cleanup.

lib/Doctrine/DBAL/Tools/Console/ConsoleRunner.php Outdated Show resolved Hide resolved
lib/Doctrine/DBAL/Tools/Console/ConsoleRunner.php Outdated Show resolved Hide resolved
lib/Doctrine/DBAL/Tools/Console/ConsoleRunner.php Outdated Show resolved Hide resolved
@dmaicher
Copy link
Contributor Author

dmaicher commented May 11, 2020

@stof I think we don't need this change for the doctrine dbal-bundle.

Its actually only one single command that we need to extend/proxy:

https://github.com/doctrine/dbal-bundle/pull/1/files#diff-3c45b0c1750eeaf9333a6f76e86e91adR15

So @morozov I'm fine if we close this. Not sure the introduced deprecations and overhead for needed fixes on related bundles/libraries are justified. If you still think this feature is useful let me know and I can fix the conflicts and we can finish this PR.

@morozov
Copy link
Member

morozov commented May 11, 2020

I think we don't need this change for the doctrine dbal-bundle.

No offense, but this is exactly why I was against the original patch in #3892 (comment):

Just adding a bunch of new code because another project needs it looks like a bad idea to me.

Whether it's adding or non-adding a feature, should be defined by whether it belongs to the project, not by whether the other project needs or doesn't need it.

If you still think this feature is useful let me know and I can fix the conflicts and we can finish this PR.

I believe it makes the functionality more extensible (i.e. the possibility to use one or more connections in CLI). Even if the bundle doesn't need it, other projects still may.

@dmaicher dmaicher requested a review from morozov May 12, 2020 18:49
@morozov
Copy link
Member

morozov commented May 12, 2020

@dmaicher could you squash everything, please?

@dmaicher dmaicher force-pushed the cli_multi_connection branch from c56ee96 to b10d4db Compare May 12, 2020 19:59
@dmaicher
Copy link
Contributor Author

@morozov done 😉

@morozov morozov merged commit 62201f9 into doctrine:2.11.x May 13, 2020
@morozov
Copy link
Member

morozov commented May 13, 2020

Thanks, @dmaicher.

@morozov
Copy link
Member

morozov commented Jun 9, 2020

@dmaicher would you mind submitting a pull request that removes the deprecated code from 3.0.x?

@dmaicher
Copy link
Contributor Author

@morozov see #4059 😉

@morozov
Copy link
Member

morozov commented Jun 10, 2020

It's nice working with you, sir.

@PowerKiKi
Copy link
Contributor

I might be missing something, but I think this break the implicit compatibility with doctrine/orm when using cli-config.php to configure CLI tools of both dbal and orm.

If I want to avoid ConnectionHelper, which has been deprecated by this PR, it seems I have to return directly a ConnectionProvider instead of a HelperSet. But orm package still require a HelperSet. That means that the following two commands cannot work at the same time anymore:

./vendor/bin/doctrine-dbal --version # will work
./vendor/bin/doctrine --version    # will throw exception

Moving forward what is the plan to support a single configuration file for both tools ?

@morozov
Copy link
Member

morozov commented Nov 3, 2020

@PowerKiKi please file an issue in the ORM repository. There isn't much we can do about it here.

@PowerKiKi
Copy link
Contributor

I forgot to mention that it also affects doctrine/migrations, since ./vendor/bin/doctrine-migrations --version will fail in the same way as ORM.

So I don't think it's a problem with ORM, nor with Migrations. But it is a problem with DBAL itself, who broke compatibility with all others. Because DBAL now refuse to accept "too much" configuration, then DBAL cannot be used with other tools anymore.

Also I don't see how ORM, or Migrations, could be made to work with only a ConnectionProvider. It requires other things, such as em for ORM and configuration for Migrations. Because of this PR (and even more so with #4059), it became nearly impossible to share a single config file that return different things depending on who is using that config.

I think this PR went overboard. And instead of replacing HelperSet with a ConnectionProvider, it should have kept the HelperSet and accept a ConnectionProvider in that HelperSet. This would allow for the improvement originally intended while preserving compatibility across the doctrine ecosystem.

Would you accept a PR that restore the HelperSet as the only right way to configure DBAL (and ORM and Migrations), while preserving the new ConnectionProvider in that HelperSet ?

@morozov
Copy link
Member

morozov commented Nov 4, 2020

Also I don't see how ORM, or Migrations, could be made to work with only a ConnectionProvider. It requires other things, such as em for ORM and configuration for Migrations.

ConnectionProvider is an interface that defines the API required by the DBAL. Apart from the API defined by the interface, the implementing class can implement any other API required by any other use cases. What's the problem in implementing such classes for the ORM and Migrations?

@PowerKiKi
Copy link
Contributor

Fair enough, it can be made to work. I somehow missed the fact that it was an interface, and it could be implemented in other packages too.

Still it seems it would have been better if other packages had similar PR at the same time. Right now there is no way to use latest DBAL with ORM or Migrations, without using something deprecated.

@PowerKiKi
Copy link
Contributor

I created the following issues to track progress in their respective packages:

beberlei added a commit to beberlei/dbal that referenced this pull request Mar 6, 2021
beberlei added a commit to beberlei/dbal that referenced this pull request Mar 7, 2021
rgrellmann added a commit to Rossmann-IT/dbal that referenced this pull request Mar 7, 2021
Release [2.11.0](https://github.com/doctrine/dbal/milestone/77)

2.11.0
======

- Total issues resolved: **7**
- Total pull requests resolved: **55**
- Total contributors: **8**

Improvement,Prepared Statements,SQL Server,Types,pdo_sqlsrv,sqlsrv
------------------------------------------------------------------

 - [4274: Support ASCII parameter binding](doctrine#4274) thanks to @gjdanis

Documentation
-------------

 - [4271: Add explanation about implicit indexes](doctrine#4271) thanks to @greg0ire

Deprecation,Error Handling
--------------------------

 - [4253: Deprecate DBAL\DBALException in favor of DBAL\Exception](doctrine#4253) thanks to @morozov

CI
--

 - [4251: Setup automatic release workflow](doctrine#4251) thanks to @greg0ire

Deprecation,Schema Managers
---------------------------

 - [4230: Deprecate the functionality of dropping client connections when dropping a database](doctrine#4230) thanks to @morozov

Deprecation,Platforms
---------------------

 - [4229: Deprecate more AbstractPlatform methods](doctrine#4229) thanks to @morozov
 - [4132: Deprecate AbstractPlatform::fixSchemaElementName()](doctrine#4132) thanks to @morozov

Improvement,Test Suite
----------------------

 - [4215: Remove test group configuration leftovers](doctrine#4215) thanks to @morozov
 - [4080: Update PHPUnit to 9.2](doctrine#4080) thanks to @morozov
 - [4079: Forward compatibility with PHPUnit 9.3](doctrine#4079) thanks to @morozov
 - [3923: Removed performance tests](doctrine#3923) thanks to @morozov

Deprecation,Schema
------------------

 - [4213: Deprecate the Synchronizer package](doctrine#4213) thanks to @morozov

Blocker,Improvement,PHP,Test Suite
----------------------------------

 - [4201: Update PHPUnit to 9.3](doctrine#4201) thanks to @morozov

Blocker,PHP,Test Suite
----------------------

 - [4196: The test suite uses the deprecated at() matcher](doctrine#4196) thanks to @morozov

Connections,Deprecation,Documentation
-------------------------------------

 - [4175: Additional deprecation note for PrimaryReplicaConnection::query()](doctrine#4175) thanks to @morozov

Connections,Deprecation,Prepared Statements
-------------------------------------------

 - [4165: Deprecated usage of wrapper components as implementations of driver-level interfaces](doctrine#4165) thanks to @morozov
 - [4020: Deprecated Connection::project(), Statement::errorCode() and errorInfo()](doctrine#4020) thanks to @morozov

Connections,Deprecation
-----------------------

 - [4163: Deprecate duplicate and ambiguous wrapper connection methods](doctrine#4163) thanks to @morozov

Error Handling,Improvement,Types
--------------------------------

 - [4145: Add TypeRegistry constructor](doctrine#4145) thanks to @morozov

Deprecation,Drivers,Improvement,pdo_mysql,pdo_oci,pdo_pgsql,pdo_sqlite,pdo_sqlsrv
---------------------------------------------------------------------------------

 - [4144: Deprecate classes in Driver\PDO* namespaces](doctrine#4144) thanks to @morozov

Connections,Documentation,Improvement
-------------------------------------

 - [4139: Mark connection constructors internal](doctrine#4139) thanks to @morozov

Deprecation,Drivers,Error Handling
----------------------------------

 - [4137: Deprecate driver exception conversion APIs](doctrine#4137) thanks to @morozov
 - [4112: Deprecate DriverException::getErrorCode()](doctrine#4112) thanks to @morozov

Configuration,Connections,Deprecation,Error Handling
----------------------------------------------------

 - [4134: Deprecate some DBALException factory methods](doctrine#4134) thanks to @morozov

Code Style,Documentation
------------------------

 - [4133: Fix more issues introduced by the deprecation of driver classes](doctrine#4133) thanks to @morozov

BC Break,Drivers,Error Handling,pdo_sqlsrv,sqlsrv
-------------------------------------------------

 - [4131: Restore the PortWithoutHost exception parent class](doctrine#4131) thanks to @morozov

Code Style,Improvement,Static Analysis
--------------------------------------

 - [4123: Remove the no longer needed error suppressions](doctrine#4123) thanks to @morozov

Deprecation,Drivers,Error Handling,Improvement
----------------------------------------------

 - [4118: Deprecate ExceptionConverterDriver](doctrine#4118) thanks to @morozov

Bug,Connections,Improvement,Prepared Statements
-----------------------------------------------

 - [4117: Fixes for the recently introduced driver-level deprecations](doctrine#4117) thanks to @morozov

Connections,Deprecation,Platform Detection
------------------------------------------

 - [4114: Deprecate ServerInfoAwareConnection#requiresQueryForServerVersion() as an implementation detail](doctrine#4114) thanks to @morozov

Deprecation,Prepared Statements,SQL Parser,oci8
-----------------------------------------------

 - [4110: Mark non-interface OCI8 driver methods internal](doctrine#4110) thanks to @morozov

Connections,Deprecation,Drivers,Improvement,Prepared Statements
---------------------------------------------------------------

 - [4100: Deprecate inconsistently and ambiguously named driver-level classes](doctrine#4100) thanks to @morozov

Connections,Improvement
-----------------------

 - [4092: Remove Connection::$isConnected](doctrine#4092) thanks to @morozov

Configuration,Connections
-------------------------

 - [4086: Mark Connection::getParams() internal](doctrine#4086) thanks to @morozov

Bug,Drivers,ibm_db2
-------------------

 - [4085: The IBM DB2 driver Exception class must implement the DriverException interface](doctrine#4085) thanks to @morozov

PHP
---

 - [4078: Bump PHP requirement to 7.3 as of DBAL 2.11.0](doctrine#4078) thanks to @morozov

Connections,Databases,Deprecation,Drivers
-----------------------------------------

 - [4068: Deprecate Driver::getDatabase()](doctrine#4068) thanks to @morozov

Deprecation,Improvement,Portability
-----------------------------------

 - [4061: Deprecated platform-specific portability mode constants](doctrine#4061) thanks to @morozov

 - [4054: &doctrine#91;doctrineGH-4052&doctrine#93; Deprecate MasterSlaveConnection and rename to PrimaryReplicaConnection](doctrine#4054) thanks to @beberlei and @albe
 - [4017: Improve help of dbal:run-sql command](doctrine#4017) thanks to @ostrolucky

Code Style,Improvement
----------------------

 - [4050: Update doctrine/coding-standard to 8.0](doctrine#4050) thanks to @morozov

Cache,Deprecation,Improvement,Prepared Statements
-------------------------------------------------

 - [4049: Replace forward-compatible ResultStatement interfaces with Result](doctrine#4049) thanks to @morozov

Cache,Improvement,Prepared Statements
-------------------------------------

 - [4048: Make caching layer not rely on closeCursor()](doctrine#4048) thanks to @morozov

Deprecation,Improvement,Prepared Statements
-------------------------------------------

 - [4037: Introduce Statement::fetchFirstColumn()](doctrine#4037) thanks to @morozov
 - [4019: Deprecated the concept of the fetch mode](doctrine#4019) thanks to @morozov

Bug,Documentation,Improvement,Prepared Statements
-------------------------------------------------

 - [4034: Additional changes based on the discussion in doctrine#4007](doctrine#4034) thanks to @morozov

Connections,Console,Improvement
-------------------------------

 - [3956: allow using multiple connections for CLI commands](doctrine#3956) thanks to @dmaicher

Deprecation,Logging
-------------------

 - [3935: Deprecate EchoSQLLogger](doctrine#3935) thanks to @morozov

Improvement,Packaging
---------------------

 - [3924: Actualize the content of the .gitattributes file](doctrine#3924) thanks to @morozov

Azure,Deprecation,Drivers,Drizzle,MariaDB,Platforms,PostgreSQL,SQL Anywhere,SQL Server,Sharding,pdo_ibm
-------------------------------------------------------------------------------------------------------

 - [3905: Deprecate the usage of the legacy platforms and drivers](doctrine#3905) thanks to @morozov

Deprecation,Query
-----------------

 - [3864: CompositeExpression and()/or() factory methods](doctrine#3864) thanks to @BenMorel
 - [3853: Deprecate calling QueryBuilder methods with an array argument](doctrine#3853) thanks to @BenMorel and @morozov

Deprecation,Tools
-----------------

 - [3861: Deprecated the usage of the Version class](doctrine#3861) thanks to @morozov

Improvement,Query
-----------------

 - [3852: First parameter of ExpressionBuilder::and/or() mandatory](doctrine#3852) thanks to @BenMorel

Deprecation,Improvement,Query
-----------------------------

 - [3851: Rename andX() / orX() methods](doctrine#3851) thanks to @BenMorel
 - [3850: Prepare CompositeExpression for immutability](doctrine#3850) thanks to @BenMorel

# gpg: Signature made Mon Sep 21 01:47:31 2020
# gpg:                using DSA key 1BEDEE0A820BC30D858F9F0C2C3A645671828132
# gpg: Can't check signature: No public key

# Conflicts:
#	README.md
#	lib/Doctrine/DBAL/Driver/AbstractOracleDriver.php
#	lib/Doctrine/DBAL/Driver/OCI8/Driver.php
#	lib/Doctrine/DBAL/Version.php
beberlei added a commit to beberlei/dbal that referenced this pull request Mar 22, 2021
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Jul 27, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants