Skip to content

Commit

Permalink
drivers: fixed support for DateTimeImmutable
Browse files Browse the repository at this point in the history
  • Loading branch information
hrach committed Sep 27, 2015
1 parent a939c94 commit 3b085c7
Show file tree
Hide file tree
Showing 4 changed files with 128 additions and 8 deletions.
16 changes: 12 additions & 4 deletions src/Drivers/Mysqli/MysqliDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -226,15 +226,23 @@ public function convertToSql($value, $type)

case self::TYPE_DATETIME:
if ($value->getTimezone()->getName() !== $this->connectionTz->getName()) {
$value = clone $value;
$value->setTimezone($this->connectionTz);
if ($value instanceof \DateTimeImmutable) {
$value = $value->setTimezone($this->connectionTz);
} else {
$value = clone $value;
$value->setTimezone($this->connectionTz);
}
}
return "'" . $value->format('Y-m-d H:i:s') . "'";

case self::TYPE_DATETIME_SIMPLE:
if ($value->getTimezone()->getName() !== $this->simpleStorageTz->getName()) {
$value = clone $value;
$value->setTimeZone($this->simpleStorageTz);
if ($value instanceof \DateTimeImmutable) {
$value = $value->setTimezone($this->simpleStorageTz);
} else {
$value = clone $value;
$value->setTimeZone($this->simpleStorageTz);
}
}
return "'" . $value->format('Y-m-d H:i:s') . "'";

Expand Down
16 changes: 12 additions & 4 deletions src/Drivers/Pgsql/PgsqlDriver.php
Original file line number Diff line number Diff line change
Expand Up @@ -220,15 +220,23 @@ public function convertToSql($value, $type)

case self::TYPE_DATETIME:
if ($value->getTimezone()->getName() !== $this->connectionTz->getName()) {
$value = clone $value;
$value->setTimezone($this->connectionTz);
if ($value instanceof \DateTimeImmutable) {
$value = $value->setTimezone($this->connectionTz);
} else {
$value = clone $value;
$value->setTimezone($this->connectionTz);
}
}
return "'" . $value->format('Y-m-d H:i:s') . "'";

case self::TYPE_DATETIME_SIMPLE:
if ($value->getTimezone()->getName() !== $this->simpleStorageTz->getName()) {
$value = clone $value;
$value->setTimezone($this->simpleStorageTz);
if ($value instanceof \DateTimeImmutable) {
$value = $value->setTimezone($this->simpleStorageTz);
} else {
$value = clone $value;
$value->setTimezone($this->simpleStorageTz);
}
}
return "'" . $value->format('Y-m-d H:i:s') . "'";

Expand Down
52 changes: 52 additions & 0 deletions tests/cases/integration/datetime.mysql.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
namespace NextrasTests\Dbal;

use DateTime;
use DateTimeImmutable;
use Tester\Assert;
use Tester\Environment;


require_once __DIR__ . '/../../bootstrap.php';

Expand Down Expand Up @@ -61,6 +64,55 @@ class DateTimeMysqlTest extends IntegrationTestCase
}


public function testWriteStorageTZUTCImmutable()
{
if (PHP_VERSION_ID < 50500) {
Environment::skip('DateTimeImmutable tested only in PHP >= 5.5');
}

$connection = $this->createConnection([
'simpleStorageTz' => 'UTC',
'connectionTz' => 'Europe/Prague',
]);

$connection->query('DROP TABLE IF EXISTS dates_write2');
$connection->query('
CREATE TABLE dates_write2 (
a datetime,
b timestamp
);
');

$connection->query(
'INSERT INTO dates_write2 VALUES (%dts, %dt)',
new DateTimeImmutable('2015-01-01 12:00:00'), // 11:00 UTC
new DateTimeImmutable('2015-01-01 12:00:00') // 11:00 UTC
);

$result = $connection->query('SELECT * FROM dates_write2');
$result->setValueNormalization(FALSE);

$row = $result->fetch();
Assert::same('2015-01-01 11:00:00', $row->a);
Assert::same('2015-01-01 12:00:00', $row->b);


$connection->query('DELETE FROM dates_write2');
$connection->query(
'INSERT INTO dates_write2 VALUES (%dts, %dt)',
new DateTimeImmutable('2015-01-01 12:00:00'), // 11:00 UTC
new DateTimeImmutable('2015-01-01 12:00:00 Europe/Kiev') // 10:00 UTC
);

$result = $connection->query('SELECT * FROM dates_write2');
$result->setValueNormalization(FALSE);

$row = $result->fetch();
Assert::same('2015-01-01 11:00:00', $row->a);
Assert::same('2015-01-01 11:00:00', $row->b);
}


public function testReadStorageTZUTC()
{
$connection = $this->createConnection([
Expand Down
52 changes: 52 additions & 0 deletions tests/cases/integration/datetime.pgsql.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
namespace NextrasTests\Dbal;

use DateTime;
use DateTimeImmutable;
use Tester\Assert;
use Tester\Environment;


require_once __DIR__ . '/../../bootstrap.php';

Expand Down Expand Up @@ -61,6 +64,55 @@ class DateTimePostgreTest extends IntegrationTestCase
}


public function testWriteStorageTZUTCImmutable()
{
if (PHP_VERSION_ID < 50500) {
Environment::skip('DateTimeImmutable tested only in PHP >= 5.5');
}

$connection = $this->createConnection([
'simpleStorageTz' => 'UTC',
'connectionTz' => 'Europe/Prague',
]);

$connection->query('DROP TABLE IF EXISTS dates_write2');
$connection->query('
CREATE TABLE dates_write2 (
a timestamp,
b timestamptz
);
');

$connection->query(
'INSERT INTO dates_write2 VALUES (%dts, %dt)',
new DateTimeImmutable('2015-01-01 12:00:00'), // 11:00 UTC
new DateTimeImmutable('2015-01-01 12:00:00') // 11:00 UTC
);

$result = $connection->query('SELECT * FROM dates_write2');
$result->setValueNormalization(FALSE);

$row = $result->fetch();
Assert::same('2015-01-01 11:00:00', $row->a);
Assert::same('2015-01-01 12:00:00+01', $row->b);


$connection->query('DELETE FROM dates_write2');
$connection->query(
'INSERT INTO dates_write2 VALUES (%dts, %dt)',
new DateTimeImmutable('2015-01-01 12:00:00'), // 11:00 UTC
new DateTimeImmutable('2015-01-01 12:00:00 Europe/Kiev') // 10:00 UTC
);

$result = $connection->query('SELECT * FROM dates_write2');
$result->setValueNormalization(FALSE);

$row = $result->fetch();
Assert::same('2015-01-01 11:00:00', $row->a);
Assert::same('2015-01-01 11:00:00+01', $row->b);
}


public function testReadStorageTZUTC()
{
$connection = $this->createConnection([
Expand Down

0 comments on commit 3b085c7

Please sign in to comment.