Unverified Commit 2179996d authored by Sergei Morozov's avatar Sergei Morozov Committed by GitHub

Merge pull request #3339 from morozov/issues/3294

ContinuousPHP configuration for PDO Oracle driver
parents 0b0015e6 b1afc40d
......@@ -4,7 +4,7 @@ reports/
dist/
download/
vendor/
*.phpunit.xml
/*.phpunit.xml
/phpunit.xml
/.phpcs-cache
/phpstan.neon
......@@ -21,7 +21,7 @@ before_commands:
tools:
external_code_coverage:
timeout: 3600
runs: 27 # 23x Travis (jobs with COVERAGE=yes) + 3x AppVeyor (jobs with coverage=yes) + 1x ContinuousPHP
runs: 28 # 23x Travis (jobs with COVERAGE=yes) + 3x AppVeyor (jobs with coverage=yes) + 2x ContinuousPHP
filter:
excluded_paths:
......
......@@ -104,7 +104,11 @@ class PDOConnection extends PDO implements Connection, ServerInfoAwareConnection
*/
public function lastInsertId($name = null)
{
return parent::lastInsertId($name);
try {
return parent::lastInsertId($name);
} catch (\PDOException $exception) {
throw new PDOException($exception);
}
}
/**
......
......@@ -3,6 +3,7 @@
namespace Doctrine\Tests\DBAL\Functional;
use Doctrine\DBAL\Driver\OCI8\Driver as OCI8Driver;
use Doctrine\DBAL\Driver\PDOOracle\Driver as PDOOracleDriver;
use Doctrine\DBAL\FetchMode;
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Schema\Table;
......@@ -21,6 +22,12 @@ class BlobTest extends DbalFunctionalTestCase
{
parent::setUp();
if ($this->connection->getDriver() instanceof PDOOracleDriver) {
// inserting BLOBs as streams on Oracle requires Oracle-specific SQL syntax which is currently not supported
// see http://php.net/manual/en/pdo.lobs.php#example-1035
$this->markTestSkipped('DBAL doesn\'t support storing LOBs represented as streams using PDO_OCI');
}
$table = new Table('blob_table');
$table->addColumn('id', 'integer');
$table->addColumn('clobfield', 'text');
......
......@@ -5,6 +5,9 @@ namespace Doctrine\Tests\DBAL\Functional;
use DateTime;
use Doctrine\DBAL\Connection;
use Doctrine\DBAL\Driver\Mysqli\Driver as MySQLiDriver;
use Doctrine\DBAL\Driver\OCI8\Driver as Oci8Driver;
use Doctrine\DBAL\Driver\PDOConnection;
use Doctrine\DBAL\Driver\PDOOracle\Driver as PDOOracleDriver;
use Doctrine\DBAL\Driver\SQLSrv\Driver as SQLSrvDriver;
use Doctrine\DBAL\FetchMode;
use Doctrine\DBAL\ParameterType;
......@@ -14,6 +17,7 @@ use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Statement;
use Doctrine\DBAL\Types\Type;
use Doctrine\Tests\DbalFunctionalTestCase;
use PDO;
use const CASE_LOWER;
use const PHP_EOL;
use function array_change_key_case;
......@@ -749,7 +753,7 @@ class DataAccessTest extends DbalFunctionalTestCase
*/
public function testFetchAllSupportFetchClass()
{
$this->skipOci8AndMysqli();
$this->beforeFetchClassTest();
$this->setupFixture();
$sql = 'SELECT test_int, test_string, test_datetime FROM fetch_table';
......@@ -791,7 +795,7 @@ class DataAccessTest extends DbalFunctionalTestCase
*/
public function testSetFetchModeClassFetchAll()
{
$this->skipOci8AndMysqli();
$this->beforeFetchClassTest();
$this->setupFixture();
$sql = 'SELECT * FROM fetch_table';
......@@ -813,7 +817,7 @@ class DataAccessTest extends DbalFunctionalTestCase
*/
public function testSetFetchModeClassFetch()
{
$this->skipOci8AndMysqli();
$this->beforeFetchClassTest();
$this->setupFixture();
$sql = 'SELECT * FROM fetch_table';
......@@ -908,16 +912,25 @@ class DataAccessTest extends DbalFunctionalTestCase
]);
}
private function skipOci8AndMysqli()
private function beforeFetchClassTest()
{
if (isset($GLOBALS['db_type']) && $GLOBALS['db_type'] === 'oci8') {
$driver = $this->connection->getDriver();
if ($driver instanceof Oci8Driver) {
$this->markTestSkipped('Not supported by OCI8');
}
if ($this->connection->getDriver()->getName() !== 'mysqli') {
if ($driver instanceof MySQLiDriver) {
$this->markTestSkipped('Mysqli driver dont support this feature.');
}
if (! $driver instanceof PDOOracleDriver) {
return;
}
$this->markTestSkipped('Mysqli driver dont support this feature.');
/** @var PDOConnection $connection */
$connection = $this->connection->getWrappedConnection();
$connection->setAttribute(PDO::ATTR_CASE, PDO::CASE_LOWER);
}
}
......
......@@ -24,7 +24,7 @@ class PDOStatementTest extends DbalFunctionalTestCase
$table = new Table('stmt_test');
$table->addColumn('id', 'integer');
$table->addColumn('name', 'text');
$table->addColumn('name', 'string');
$this->connection->getSchemaManager()->dropAndCreateTable($table);
}
......
......@@ -11,20 +11,25 @@ use function array_map;
class OracleSchemaManagerTest extends SchemaManagerFunctionalTestCase
{
/** @var bool */
private static $privilegesGranted = false;
protected function setUp()
{
parent::setUp();
if (! isset($GLOBALS['db_username'])) {
$this->markTestSkipped('Foo');
if (self::$privilegesGranted) {
return;
}
$username = $GLOBALS['db_username'];
if (! isset($GLOBALS['db_username'])) {
self::markTestSkipped('Username must be explicitly specified in connection parameters for this test');
}
$query = 'GRANT ALL PRIVILEGES TO ' . $username;
TestUtil::getTempConnection()
->exec('GRANT ALL PRIVILEGES TO ' . $GLOBALS['db_username']);
$conn = TestUtil::getTempConnection();
$conn->executeUpdate($query);
self::$privilegesGranted = true;
}
public function testRenameTable()
......
......@@ -2,6 +2,7 @@
namespace Doctrine\Tests\DBAL\Functional;
use Doctrine\DBAL\Driver\PDOOracle\Driver as PDOOracleDriver;
use Doctrine\DBAL\Driver\Statement;
use Doctrine\DBAL\FetchMode;
use Doctrine\DBAL\ParameterType;
......@@ -25,6 +26,10 @@ class StatementTest extends DbalFunctionalTestCase
public function testStatementIsReusableAfterClosingCursor()
{
if ($this->connection->getDriver() instanceof PDOOracleDriver) {
$this->markTestIncomplete('See https://bugs.php.net/bug.php?id=77181');
}
$this->connection->insert('stmt_test', ['id' => 1]);
$this->connection->insert('stmt_test', ['id' => 2]);
......@@ -46,6 +51,10 @@ class StatementTest extends DbalFunctionalTestCase
public function testReuseStatementWithLongerResults()
{
if ($this->connection->getDriver() instanceof PDOOracleDriver) {
$this->markTestIncomplete('PDO_OCI doesn\'t support fetching blobs via PDOStatement::fetchAll()');
}
$sm = $this->connection->getSchemaManager();
$table = new Table('stmt_longer_results');
$table->addColumn('param', 'string');
......@@ -79,6 +88,12 @@ class StatementTest extends DbalFunctionalTestCase
public function testFetchLongBlob()
{
if ($this->connection->getDriver() instanceof PDOOracleDriver) {
// inserting BLOBs as streams on Oracle requires Oracle-specific SQL syntax which is currently not supported
// see http://php.net/manual/en/pdo.lobs.php#example-1035
$this->markTestSkipped('DBAL doesn\'t support storing LOBs represented as streams using PDO_OCI');
}
// make sure memory limit is large enough to not cause false positives,
// but is still not enough to store a LONGBLOB of the max possible size
$this->iniSet('memory_limit', '4G');
......@@ -138,6 +153,10 @@ EOF
public function testReuseStatementAfterClosingCursor()
{
if ($this->connection->getDriver() instanceof PDOOracleDriver) {
$this->markTestIncomplete('See https://bugs.php.net/bug.php?id=77181');
}
$this->connection->insert('stmt_test', ['id' => 1]);
$this->connection->insert('stmt_test', ['id' => 2]);
......
......@@ -3,6 +3,7 @@
namespace Doctrine\Tests\DBAL\Functional;
use DateTime;
use Doctrine\DBAL\Driver\PDOOracle\Driver as PDOOracleDriver;
use Doctrine\DBAL\Schema\Table;
use Doctrine\DBAL\Types\Type;
use Doctrine\Tests\DbalFunctionalTestCase;
......@@ -77,6 +78,12 @@ class TypeConversionTest extends DbalFunctionalTestCase
*/
public function testIdempotentDataConversion($type, $originalValue, $expectedPhpType)
{
if ($type === 'text' && $this->connection->getDriver() instanceof PDOOracleDriver) {
// inserting BLOBs as streams on Oracle requires Oracle-specific SQL syntax which is currently not supported
// see http://php.net/manual/en/pdo.lobs.php#example-1035
$this->markTestSkipped('DBAL doesn\'t support storing LOBs represented as streams using PDO_OCI');
}
$columnName = 'test_' . $type;
$typeInstance = Type::getType($type);
$insertionValue = $typeInstance->convertToDatabaseValue($originalValue, $this->connection->getDatabasePlatform());
......
......@@ -5,6 +5,7 @@ declare(strict_types=1);
namespace Doctrine\Tests\DBAL\Functional\Types;
use Doctrine\DBAL\Driver\IBMDB2\DB2Driver;
use Doctrine\DBAL\Driver\PDOOracle\Driver as PDOOracleDriver;
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Schema\Table;
use Doctrine\Tests\DbalFunctionalTestCase;
......@@ -19,6 +20,10 @@ class BinaryTest extends DbalFunctionalTestCase
{
parent::setUp();
if ($this->connection->getDriver() instanceof PDOOracleDriver) {
$this->markTestSkipped('PDO_OCI doesn\'t support binding binary values');
}
$table = new Table('binary_table');
$table->addColumn('id', 'binary', [
'length' => 16,
......
......@@ -3,6 +3,7 @@
namespace Doctrine\Tests\DBAL\Functional;
use DateTime;
use Doctrine\DBAL\Driver\DriverException;
use Doctrine\DBAL\ParameterType;
use Doctrine\DBAL\Schema\Sequence;
use Doctrine\DBAL\Schema\Table;
......@@ -149,7 +150,7 @@ class WriteTest extends DbalFunctionalTestCase
}
self::assertEquals(1, $this->connection->insert('write_table', ['test_int' => 2, 'test_string' => 'bar']));
$num = $this->connection->lastInsertId();
$num = $this->lastInsertId();
self::assertNotNull($num, 'LastInsertId() should not be null.');
self::assertGreaterThan(0, $num, 'LastInsertId() should be non-negative number.');
......@@ -175,7 +176,7 @@ class WriteTest extends DbalFunctionalTestCase
$stmt = $this->connection->query($this->connection->getDatabasePlatform()->getSequenceNextValSQL('write_table_id_seq'));
$nextSequenceVal = $stmt->fetchColumn();
$lastInsertId = $this->connection->lastInsertId('write_table_id_seq');
$lastInsertId = $this->lastInsertId('write_table_id_seq');
self::assertGreaterThan(0, $lastInsertId);
self::assertEquals($nextSequenceVal, $lastInsertId);
......@@ -187,7 +188,7 @@ class WriteTest extends DbalFunctionalTestCase
$this->markTestSkipped("Test only works consistently on platforms that support sequences and don't support identity columns.");
}
self::assertFalse($this->connection->lastInsertId(null));
self::assertFalse($this->lastInsertId());
}
/**
......@@ -285,11 +286,11 @@ class WriteTest extends DbalFunctionalTestCase
$this->connection->exec($sql);
$firstId = $this->connection->lastInsertId($seqName);
$firstId = $this->lastInsertId($seqName);
$this->connection->exec($sql);
$secondId = $this->connection->lastInsertId($seqName);
$secondId = $this->lastInsertId($seqName);
self::assertGreaterThan($firstId, $secondId);
}
......@@ -334,4 +335,25 @@ class WriteTest extends DbalFunctionalTestCase
self::assertCount(0, $data);
}
/**
* Returns the ID of the last inserted row or skips the test if the currently used driver
* doesn't support this feature
*
* @return string
*
* @throws DriverException
*/
private function lastInsertId(?string $name = null)
{
try {
return $this->connection->lastInsertId($name);
} catch (DriverException $e) {
if ($e->getCode() === 'IM001') {
$this->markTestSkipped($e->getMessage());
}
throw $e;
}
}
}
......@@ -2,7 +2,18 @@
declare(strict_types=1);
use Doctrine\DBAL\DriverManager;
(static function () : void {
// workaround for https://bugs.php.net/bug.php?id=77120
DriverManager::getConnection([
'driver' => 'oci8',
'host' => 'oracle-xe-11',
'user' => 'ORACLE',
'password' => 'ORACLE',
'dbname' => 'XE',
])->query('ALTER USER ORACLE IDENTIFIED BY ORACLE');
$pos = array_search('--coverage-clover', $_SERVER['argv'], true);
if ($pos === false) {
......
#!/bin/bash
set -euo pipefail
phpbrew ext install pdo_oci -- --with-pdo-oci=instantclient,/usr/local/instantclient
<?xml version="1.0" encoding="utf-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="../../vendor/phpunit/phpunit/phpunit.xsd"
colors="true"
beStrictAboutOutputDuringTests="true"
beStrictAboutTodoAnnotatedTests="true"
failOnRisky="true"
failOnWarning="true"
bootstrap="bootstrap.php"
>
<php>
<var name="db_type" value="pdo_oci"/>
<var name="db_host" value="oracle-xe-11" />
<var name="db_username" value="C##doctrine" />
<var name="db_password" value="ORACLE" />
<var name="db_name" value="XE" />
<var name="db_port" value="1521"/>
<var name="db_event_subscribers" value="Doctrine\DBAL\Event\Listeners\OracleSessionInit"/>
<var name="tmpdb_type" value="pdo_oci"/>
<var name="tmpdb_host" value="oracle-xe-11" />
<var name="tmpdb_username" value="ORACLE" />
<var name="tmpdb_password" value="ORACLE" />
<var name="tmpdb_name" value="XE" />
<var name="tmpdb_port" value="1521"/>
</php>
<testsuites>
<testsuite name="Doctrine DBAL Test Suite">
<directory>../Doctrine/Tests/DBAL</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory suffix=".php">../../lib/Doctrine</directory>
</whitelist>
</filter>
<listeners>
<listener class="Symfony\Bridge\PhpUnit\SymfonyTestsListener" />
</listeners>
</phpunit>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment