Skip to content

Commit

Permalink
Merge pull request doctrine#3808 from morozov/remove-oci8-connection-…
Browse files Browse the repository at this point in the history
…execute-mode

Removed the OCI8Connection::getExecuteMode() method
  • Loading branch information
Ocramius authored Jan 13, 2020
2 parents 04db0ef + a0ff364 commit 489cb9e
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 26 deletions.
1 change: 1 addition & 0 deletions UPGRADE.md
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ Table columns are no longer indexed by column name. Use the `name` attribute of
- Class `Doctrine\DBAL\Driver\Mysqli\Driver` was made final.
- Class `Doctrine\DBAL\Driver\Mysqli\MysqliStatement` was made final.
- Class `Doctrine\DBAL\Driver\OCI8\Driver` was made final.
- Class `Doctrine\DBAL\Driver\OCI8\OCI8Connection` was made final.
- Class `Doctrine\DBAL\Driver\OCI8\OCI8Statement` was made final.
- Class `Doctrine\DBAL\Driver\PDOSqlsrv\Driver` was made final.
- Class `Doctrine\DBAL\Driver\PDOSqlsrv\Statement` was made final.
Expand Down
31 changes: 31 additions & 0 deletions lib/Doctrine/DBAL/Driver/OCI8/ExecutionMode.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
<?php

declare(strict_types=1);

namespace Doctrine\DBAL\Driver\OCI8;

/**
* Encapsulates the execution mode that is shared between the connection and its statements.
*
* @internal This class is not covered by the backward compatibility promise
*/
final class ExecutionMode
{
/** @var bool */
private $isAutoCommitEnabled = true;

public function enableAutoCommit() : void
{
$this->isAutoCommitEnabled = true;
}

public function disableAutoCommit() : void
{
$this->isAutoCommitEnabled = false;
}

public function isAutoCommitEnabled() : bool
{
return $this->isAutoCommitEnabled;
}
}
27 changes: 9 additions & 18 deletions lib/Doctrine/DBAL/Driver/OCI8/OCI8Connection.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,7 @@
use Doctrine\DBAL\Driver\ServerInfoAwareConnection;
use Doctrine\DBAL\Driver\Statement as DriverStatement;
use UnexpectedValueException;
use const OCI_COMMIT_ON_SUCCESS;
use const OCI_DEFAULT;
use const OCI_NO_AUTO_COMMIT;
use function addcslashes;
use function oci_commit;
use function oci_connect;
Expand All @@ -26,13 +24,13 @@
/**
* OCI8 implementation of the Connection interface.
*/
class OCI8Connection implements Connection, ServerInfoAwareConnection
final class OCI8Connection implements Connection, ServerInfoAwareConnection
{
/** @var resource */
protected $dbh;

/** @var int */
protected $executeMode = OCI_COMMIT_ON_SUCCESS;
/** @var ExecutionMode */
private $executionMode;

/**
* Creates a Connection to an Oracle Database using oci8 extension.
Expand All @@ -55,7 +53,8 @@ public function __construct(
throw OCI8Exception::fromErrorInfo(oci_error());
}

$this->dbh = $dbh;
$this->dbh = $dbh;
$this->executionMode = new ExecutionMode();
}

/**
Expand Down Expand Up @@ -90,7 +89,7 @@ public function getServerVersion() : string
*/
public function prepare(string $sql) : DriverStatement
{
return new OCI8Statement($this->dbh, $sql, $this);
return new OCI8Statement($this->dbh, $sql, $this->executionMode);
}

/**
Expand Down Expand Up @@ -143,20 +142,12 @@ public function lastInsertId(?string $name = null) : string
return $result;
}

/**
* Returns the current execution mode.
*/
public function getExecuteMode() : int
{
return $this->executeMode;
}

/**
* {@inheritdoc}
*/
public function beginTransaction() : void
{
$this->executeMode = OCI_NO_AUTO_COMMIT;
$this->executionMode->disableAutoCommit();
}

/**
Expand All @@ -168,7 +159,7 @@ public function commit() : void
throw OCI8Exception::fromErrorInfo(oci_error($this->dbh));
}

$this->executeMode = OCI_COMMIT_ON_SUCCESS;
$this->executionMode->enableAutoCommit();
}

/**
Expand All @@ -180,6 +171,6 @@ public function rollBack() : void
throw OCI8Exception::fromErrorInfo(oci_error($this->dbh));
}

$this->executeMode = OCI_COMMIT_ON_SUCCESS;
$this->executionMode->enableAutoCommit();
}
}
24 changes: 16 additions & 8 deletions lib/Doctrine/DBAL/Driver/OCI8/OCI8Statement.php
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,11 @@
use const OCI_B_BIN;
use const OCI_B_BLOB;
use const OCI_BOTH;
use const OCI_COMMIT_ON_SUCCESS;
use const OCI_D_LOB;
use const OCI_FETCHSTATEMENT_BY_COLUMN;
use const OCI_FETCHSTATEMENT_BY_ROW;
use const OCI_NO_AUTO_COMMIT;
use const OCI_NUM;
use const OCI_RETURN_LOBS;
use const OCI_RETURN_NULLS;
Expand Down Expand Up @@ -52,8 +54,8 @@ final class OCI8Statement implements IteratorAggregate, Statement
/** @var resource */
protected $_sth;

/** @var OCI8Connection */
protected $_conn;
/** @var ExecutionMode */
protected $executionMode;

/** @var int[] */
protected static $fetchModeMap = [
Expand Down Expand Up @@ -93,17 +95,17 @@ final class OCI8Statement implements IteratorAggregate, Statement
*
* @throws OCI8Exception
*/
public function __construct($dbh, string $query, OCI8Connection $conn)
public function __construct($dbh, string $query, ExecutionMode $executionMode)
{
[$query, $paramMap] = (new ConvertPositionalToNamedPlaceholders())($query);

$stmt = oci_parse($dbh, $query);
assert(is_resource($stmt));

$this->_sth = $stmt;
$this->_dbh = $dbh;
$this->_paramMap = $paramMap;
$this->_conn = $conn;
$this->_sth = $stmt;
$this->_dbh = $dbh;
$this->_paramMap = $paramMap;
$this->executionMode = $executionMode;
}

/**
Expand Down Expand Up @@ -208,7 +210,13 @@ public function execute(?array $params = null) : void
}
}

$ret = @oci_execute($this->_sth, $this->_conn->getExecuteMode());
if ($this->executionMode->isAutoCommitEnabled()) {
$mode = OCI_COMMIT_ON_SUCCESS;
} else {
$mode = OCI_NO_AUTO_COMMIT;
}

$ret = @oci_execute($this->_sth, $mode);
if (! $ret) {
throw OCI8Exception::fromErrorInfo(oci_error($this->_sth));
}
Expand Down
33 changes: 33 additions & 0 deletions tests/Doctrine/Tests/DBAL/Driver/OCI8/ExecutionModeTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace Doctrine\Tests\DBAL\Driver\OCI8;

use Doctrine\DBAL\Driver\OCI8\ExecutionMode;
use PHPStan\Testing\TestCase;

final class ExecutionModeTest extends TestCase
{
/** @var ExecutionMode */
private $mode;

protected function setUp() : void
{
$this->mode = new ExecutionMode();
}

public function testDefaultAutoCommitStatus() : void
{
self::assertTrue($this->mode->isAutoCommitEnabled());
}

public function testChangeAutoCommitStatus() : void
{
$this->mode->disableAutoCommit();
self::assertFalse($this->mode->isAutoCommitEnabled());

$this->mode->enableAutoCommit();
self::assertTrue($this->mode->isAutoCommitEnabled());
}
}

0 comments on commit 489cb9e

Please sign in to comment.