Skip to content

Commit 18605a4

Browse files
committed
added option convertDateTime
1 parent 8682240 commit 18605a4

File tree

6 files changed

+53
-9
lines changed

6 files changed

+53
-9
lines changed

src/Database/Connection.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ class Connection
3030
'pdo-sqlite' => Drivers\PDO\SQLite\Driver::class,
3131
'pdo-sqlsrv' => Drivers\PDO\SQLSrv\Driver::class,
3232
];
33-
private const TypeConverterOptions = ['convertBoolean', 'newDateTime'];
33+
private const TypeConverterOptions = ['convertBoolean', 'convertDateTime', 'newDateTime'];
3434

3535
/** @var array<callable(self): void> Occurs after connection is established */
3636
public array $onConnect = [];

src/Database/Drivers/Engines/MySQLEngine.php

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -192,10 +192,10 @@ public function convertToPhp(mixed $value, array $meta, TypeConverter $converter
192192
'TINY' => $meta['size'] === 1 && $converter->convertBoolean
193193
? $converter->toBool($value)
194194
: $converter->toInt($value),
195-
'TIME' => $converter->toInterval($value),
196-
'DATE', 'DATETIME', 'TIMESTAMP' => str_starts_with($value, '0000-00')
197-
? null
198-
: $converter->toDateTime($value),
195+
'TIME' => $converter->convertDateTime ? $converter->toInterval($value) : $value,
196+
'DATE', 'DATETIME', 'TIMESTAMP' => $converter->convertDateTime
197+
? (str_starts_with($value, '0000-00') ? null : $converter->toDateTime($value))
198+
: $value,
199199
default => $converter->convertToPhp($value, $meta),
200200
};
201201
}

src/Database/Drivers/Engines/SQLiteEngine.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ public function getForeignKeys(string $table): array
233233

234234
public function convertToPhp(mixed $value, array $meta, TypeConverter $converter): mixed
235235
{
236-
return in_array($meta['nativeType'], ['DATE', 'DATETIME'], strict: true)
236+
return $converter->convertDateTime && in_array($meta['nativeType'], ['DATE', 'DATETIME'], strict: true)
237237
? (is_int($value) ? (new DateTime)->setTimestamp($value) : new DateTime($value))
238238
: $converter->convertToPhp($value, $meta);
239239
}

src/Database/TypeConverter.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ final class TypeConverter
3737
];
3838

3939
public bool $convertBoolean = true;
40+
public bool $convertDateTime = true;
4041
public bool $newDateTime = true;
4142

4243

@@ -66,9 +67,9 @@ public function convertToPhp(mixed $value, array $meta): mixed
6667
self::Float,
6768
self::Decimal => $this->toFloat($value),
6869
self::Boolean => $this->convertBoolean ? $this->toBool($value) : $value,
69-
self::DateTime, self::Date => $this->toDateTime($value),
70-
self::Time => $this->toTime($value),
71-
self::Interval => self::toInterval($value),
70+
self::DateTime, self::Date => $this->convertDateTime ? $this->toDateTime($value) : $value,
71+
self::Time => $this->convertDateTime ? $this->toTime($value) : $value,
72+
self::Interval => $this->convertDateTime ? self::toInterval($value) : $value,
7273
default => $value,
7374
};
7475
}

tests/Database/connection.options.mysql.phpt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,22 @@ test('newDateTime = true', function () {
7272
$field = $connection->fetchField('SELECT NOW()');
7373
Assert::type(Nette\Database\DateTime::class, $field);
7474
});
75+
76+
77+
test('default convertDateTime', function () {
78+
$connection = connectToDB(['convertDateTime' => null])->getConnection();
79+
$field = $connection->fetchField('SELECT NOW()');
80+
Assert::type(Nette\Database\DateTime::class, $field);
81+
});
82+
83+
test('convertDateTime = false', function () {
84+
$connection = connectToDB(['convertDateTime' => false])->getConnection();
85+
$field = $connection->fetchField('SELECT NOW()');
86+
Assert::type('string', $field);
87+
});
88+
89+
test('convertDateTime = true', function () {
90+
$connection = connectToDB(['convertDateTime' => true])->getConnection();
91+
$field = $connection->fetchField('SELECT NOW()');
92+
Assert::type(Nette\Database\DateTime::class, $field);
93+
});

tests/Database/connection.options.sqlite.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,27 @@ test('formatDateTime', function () {
2323
$engine = $connection->getDatabaseEngine();
2424
Assert::same('1978-01-23', $engine->formatDateTime(new DateTime('1978-01-23 00:00:00')));
2525
});
26+
27+
28+
test('default convertDateTime', function () {
29+
$connection = connectToDB(['convertDateTime' => null])->getConnection();
30+
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlite-nette_test3.sql');
31+
$row = $connection->fetch('SELECT * FROM types');
32+
Assert::type(Nette\Database\DateTime::class, $row->date);
33+
Assert::type(Nette\Database\DateTime::class, $row->datetime);
34+
});
35+
36+
test('convertDateTime = false', function () {
37+
$connection = connectToDB(['convertDateTime' => false])->getConnection();
38+
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlite-nette_test3.sql');
39+
$row = $connection->fetch('SELECT * FROM types');
40+
Assert::type('int', $row->date);
41+
Assert::type('int', $row->datetime);
42+
});
43+
44+
test('convertDateTime = true', function () {
45+
$connection = connectToDB(['convertDateTime' => true])->getConnection();
46+
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlite-nette_test3.sql');
47+
$row = $connection->fetch('SELECT * FROM types');
48+
Assert::type(Nette\Database\DateTime::class, $row->date);
49+
});

0 commit comments

Comments
 (0)