Skip to content

Commit

Permalink
added option convertDateTime
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Aug 28, 2024
1 parent fcc7bae commit 1dc1c62
Show file tree
Hide file tree
Showing 6 changed files with 53 additions and 9 deletions.
8 changes: 4 additions & 4 deletions src/Database/Drivers/Engines/MySQLEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -173,10 +173,10 @@ public function resolveColumnConverter(array $meta, TypeConverter $converter): ?
'TINY' => $meta['length'] === 1 && $converter->convertBoolean
? $converter->toBool(...)
: $converter->toInt(...),
'TIME' => $converter->toInterval(...),
'DATE', 'DATETIME', 'TIMESTAMP' => fn($value): ?\DateTimeInterface => str_starts_with($value, '0000-00')
? null
: $converter->toDateTime($value),
'TIME' => $converter->convertDateTime ? $converter->toInterval(...) : null,
'DATE', 'DATETIME', 'TIMESTAMP' => $converter->convertDateTime ?
(fn($value): ?\DateTimeInterface => str_starts_with($value, '0000-00') ? null : $converter->toDateTime($value))
: null,
default => $converter->resolve($meta['nativeType']),
};
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/Drivers/Engines/SQLiteEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ public function getForeignKeys(string $table): array

public function resolveColumnConverter(array $meta, TypeConverter $converter): ?\Closure
{
return in_array($meta['nativeType'], ['DATE', 'DATETIME'], true)
return $converter->convertDateTime && in_array($meta['nativeType'], ['DATE', 'DATETIME'], true)
? (fn($value): \DateTimeInterface => is_int($value) ? (new DateTime)->setTimestamp($value) : new DateTime($value))
: $converter->resolve($meta['nativeType']);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public function createDriverFromDsn(
public function createTypeConverter(array &$options): TypeConverter
{
$converter = new TypeConverter;
foreach (['convertBoolean', 'newDateTime'] as $opt) {
foreach (['convertBoolean', 'convertDateTime', 'newDateTime'] as $opt) {
if (isset($options[$opt])) {
$converter->$opt = (bool) $options[$opt];
unset($options[$opt]);
Expand Down
7 changes: 4 additions & 3 deletions src/Database/TypeConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ final class TypeConverter
];

public bool $convertBoolean = true;
public bool $convertDateTime = true;
public bool $newDateTime = true;


Expand Down Expand Up @@ -66,9 +67,9 @@ public function resolve(string $nativeType): ?\Closure
self::Float,
self::Decimal => $this->toFloat(...),
self::Boolean => $this->convertBoolean ? $this->toBool(...) : null,
self::DateTime, self::Date => $this->toDateTime(...),
self::Time => $this->toTime(...),
self::Interval => self::toInterval(...),
self::DateTime, self::Date => $this->convertDateTime ? $this->toDateTime(...) : null,
self::Time => $this->convertDateTime ? $this->toTime(...) : null,
self::Interval => $this->convertDateTime ? self::toInterval(...) : null,
default => null,
};
}
Expand Down
19 changes: 19 additions & 0 deletions tests/Database/connection.options.mysql.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,22 @@ test('newDateTime = true', function () {
$field = $connection->fetchField('SELECT NOW()');
Assert::type(Nette\Database\DateTime::class, $field);
});


test('default convertDateTime', function () {
$connection = connectToDB(['convertDateTime' => null])->getConnection();
$field = $connection->fetchField('SELECT NOW()');
Assert::type(Nette\Database\DateTime::class, $field);
});

test('convertDateTime = false', function () {
$connection = connectToDB(['convertDateTime' => false])->getConnection();
$field = $connection->fetchField('SELECT NOW()');
Assert::type('string', $field);
});

test('convertDateTime = true', function () {
$connection = connectToDB(['convertDateTime' => true])->getConnection();
$field = $connection->fetchField('SELECT NOW()');
Assert::type(Nette\Database\DateTime::class, $field);
});
24 changes: 24 additions & 0 deletions tests/Database/connection.options.sqlite.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,27 @@ test('formatDateTime', function () {
$engine = $connection->getDatabaseEngine();
Assert::same('1978-01-23', $engine->formatDateTime(new DateTime('1978-01-23 00:00:00')));
});


test('default convertDateTime', function () {
$connection = connectToDB(['convertDateTime' => null])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlite-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::type(Nette\Database\DateTime::class, $row->date);
Assert::type(Nette\Database\DateTime::class, $row->datetime);
});

test('convertDateTime = false', function () {
$connection = connectToDB(['convertDateTime' => false])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlite-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::type('int', $row->date);
Assert::type('int', $row->datetime);
});

test('convertDateTime = true', function () {
$connection = connectToDB(['convertDateTime' => true])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlite-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::type(Nette\Database\DateTime::class, $row->date);
});

0 comments on commit 1dc1c62

Please sign in to comment.