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

[GH-4687] Deprecate Connection::lastInsertId($name) #4688

Merged
merged 1 commit into from
Jun 25, 2021
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
@@ -8,6 +8,12 @@ awareness about deprecated code.

# Upgrade to 3.2

## Deprecated `Connection::lastInsertId($name)`

The usage of `Connection::lastInsertId()` with a sequence name is deprecated as unsafe in scenarios with multiple
concurrent connections. If a newly inserted row needs to be referenced, it is recommended to generate its identifier
explicitly prior to insertion.

## Introduction of PSR-6 for result caching

Instead of relying on the deprecated `doctrine/cache` library, a PSR-6 cache
8 changes: 8 additions & 0 deletions src/Connection.php
Original file line number Diff line number Diff line change
@@ -1209,6 +1209,14 @@ public function getTransactionNestingLevel()
*/
public function lastInsertId($name = null)
{
if ($name !== null) {
Deprecation::trigger(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);
}

try {
return $this->getWrappedConnection()->lastInsertId($name);
} catch (Driver\Exception $e) {
9 changes: 9 additions & 0 deletions src/Driver/IBMDB2/Connection.php
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;
use stdClass;

use function assert;
@@ -119,6 +120,14 @@ public function exec(string $sql): int
*/
public function lastInsertId($name = null)
{
if ($name !== null) {
Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);
}

return db2_last_insert_id($this->conn);
}

9 changes: 9 additions & 0 deletions src/Driver/Mysqli/Connection.php
Original file line number Diff line number Diff line change
@@ -9,6 +9,7 @@
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;
use mysqli;

use function assert;
@@ -134,6 +135,14 @@ public function exec(string $sql): int
*/
public function lastInsertId($name = null)
{
if ($name !== null) {
Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);
}

return $this->conn->insert_id;
}

7 changes: 7 additions & 0 deletions src/Driver/OCI8/Connection.php
Original file line number Diff line number Diff line change
@@ -10,6 +10,7 @@
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;

use function addcslashes;
use function assert;
@@ -125,6 +126,12 @@ public function lastInsertId($name = null)
return false;
}

Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);

$result = $this->query('SELECT ' . $name . '.CURRVAL FROM DUAL')->fetchOne();

if ($result === false) {
7 changes: 7 additions & 0 deletions src/Driver/PDO/Connection.php
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as StatementInterface;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;
use PDO;
use PDOException;
use PDOStatement;
@@ -106,6 +107,12 @@ public function lastInsertId($name = null)
return $this->connection->lastInsertId();
}

Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);

return $this->connection->lastInsertId($name);
} catch (PDOException $exception) {
throw Exception::new($exception);
7 changes: 7 additions & 0 deletions src/Driver/PDO/SQLSrv/Connection.php
Original file line number Diff line number Diff line change
@@ -7,6 +7,7 @@
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as StatementInterface;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;
use PDO;

final class Connection implements ServerInfoAwareConnection
@@ -53,6 +54,12 @@ public function lastInsertId($name = null)
return $this->connection->lastInsertId($name);
}

Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);

return $this->prepare('SELECT CONVERT(VARCHAR(MAX), current_value) FROM sys.sequences WHERE name = ?')
->execute([$name])
->fetchOne();
7 changes: 7 additions & 0 deletions src/Driver/SQLSrv/Connection.php
Original file line number Diff line number Diff line change
@@ -8,6 +8,7 @@
use Doctrine\DBAL\Driver\SQLSrv\Exception\Error;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;

use function is_float;
use function is_int;
@@ -109,6 +110,12 @@ public function exec(string $sql): int
public function lastInsertId($name = null)
{
if ($name !== null) {
Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);

$result = $this->prepare('SELECT CONVERT(VARCHAR(MAX), current_value) FROM sys.sequences WHERE name = ?')
->execute([$name]);
} else {
9 changes: 9 additions & 0 deletions src/Portability/Connection.php
Original file line number Diff line number Diff line change
@@ -6,6 +6,7 @@
use Doctrine\DBAL\Driver\Result as DriverResult;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use Doctrine\DBAL\ParameterType;
use Doctrine\Deprecations\Deprecation;

/**
* Portability wrapper for a Connection.
@@ -64,6 +65,14 @@ public function exec(string $sql): int
*/
public function lastInsertId($name = null)
{
if ($name !== null) {
Deprecation::triggerIfCalledFromOutside(
'doctrine/dbal',
'https://github.com/doctrine/dbal/issues/4687',
'The usage of Connection::lastInsertId() with a sequence name is deprecated.'
);
}

return $this->connection->lastInsertId($name);
}