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 29, 2024
1 parent 4a9df82 commit c5e1d3e
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 @@ -182,10 +182,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),
};
}
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 @@ -231,7 +231,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);
}
Expand Down
2 changes: 1 addition & 1 deletion src/Database/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ final class Factory
'pdo-sqlite' => Drivers\PDO\SQLite\Driver::class,
'pdo-sqlsrv' => Drivers\PDO\SQLSrv\Driver::class,
];
private const TypeConverterOptions = ['convertBoolean', 'newDateTime'];
private const TypeConverterOptions = ['convertBoolean', 'convertDateTime', 'newDateTime'];


/** @internal */
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(array $meta): ?\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 c5e1d3e

Please sign in to comment.