Skip to content

Commit

Permalink
added option convertDecimal
Browse files Browse the repository at this point in the history
  • Loading branch information
dg committed Aug 28, 2024
1 parent 2ddaef1 commit a16b9f5
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 15 deletions.
6 changes: 3 additions & 3 deletions src/Database/Drivers/Engines/MySQLEngine.php
Original file line number Diff line number Diff line change
Expand Up @@ -167,9 +167,9 @@ public function getForeignKeys(string $table): array
public function resolveColumnConverter(array $meta, TypeConverter $converter): ?\Closure
{
return match ($meta['nativeType']) {
'NEWDECIMAL' => $meta['precision'] === 0
? $converter->toInt(...)
: $converter->toFloat(...), // precision in PDOStatement::getColumnMeta() means scale
'NEWDECIMAL' => $converter->convertDecimal
? ($meta['precision'] === 0 ? $converter->toInt(...) : $converter->toFloat(...)) // precision in PDOStatement::getColumnMeta() means scale
: null,
'TINY' => $meta['length'] === 1 && $converter->convertBoolean
? $converter->toBool(...)
: $converter->toInt(...),
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', 'convertDateTime', 'newDateTime'] as $opt) {
foreach (['convertBoolean', 'convertDateTime', 'convertDecimal', 'newDateTime'] as $opt) {
if (isset($options[$opt])) {
$converter->$opt = (bool) $options[$opt];
unset($options[$opt]);
Expand Down
5 changes: 3 additions & 2 deletions src/Database/TypeConverter.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ final class TypeConverter

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


Expand All @@ -64,8 +65,8 @@ public function resolve(string $nativeType): ?\Closure
{
return match ($this->detectType($nativeType)) {
self::Integer => $this->toInt(...),
self::Float,
self::Decimal => $this->toFloat(...),
self::Float => $this->toFloat(...),
self::Decimal => $this->convertDecimal ? $this->toFloat(...) : null,
self::Boolean => $this->convertBoolean ? $this->toBool(...) : null,
self::DateTime, self::Date => $this->convertDateTime ? $this->toDateTime(...) : null,
self::Time => $this->convertDateTime ? $this->toTime(...) : null,
Expand Down
46 changes: 40 additions & 6 deletions tests/Database/connection.options.mysql.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -15,42 +15,42 @@ require __DIR__ . '/../bootstrap.php';
test('default charset', function () {
$connection = connectToDB(['charset' => null])->getConnection();
$row = $connection->fetch("SHOW VARIABLES LIKE 'character_set_client'");
Assert::equal('utf8mb4', $row->Value);
Assert::same('utf8mb4', $row->Value);
});

test('custom charset', function () {
$connection = connectToDB(['charset' => 'latin2'])->getConnection();
$row = $connection->fetch("SHOW VARIABLES LIKE 'character_set_client'");
Assert::equal('latin2', $row->Value);
Assert::same('latin2', $row->Value);
});

test('custom sqlmode', function () {
$desiredMode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
$connection = connectToDB(['sqlmode' => $desiredMode])->getConnection();
$field = $connection->fetchField('SELECT @@sql_mode');
Assert::equal($desiredMode, $field);
Assert::same($desiredMode, $field);
});


test('default convertBoolean', function () {
$connection = connectToDB(['convertBoolean' => null])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/mysql-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::equal(true, $row->bool);
Assert::same(true, $row->bool);
});

test('convertBoolean = true', function () {
$connection = connectToDB(['convertBoolean' => true])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/mysql-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::equal(true, $row->bool);
Assert::same(true, $row->bool);
});

test('convertBoolean = false', function () {
$connection = connectToDB(['convertBoolean' => false])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/mysql-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::equal(1, $row->bool);
Assert::same(1, $row->bool);
});


Expand Down Expand Up @@ -90,3 +90,37 @@ test('convertDateTime = true', function () {
$field = $connection->fetchField('SELECT NOW()');
Assert::type(Nette\Database\DateTime::class, $field);
});


test('default convertDecimal', function () {
$connection = connectToDB(['convertDecimal' => null])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/mysql-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::same(1, $row->decimal);
Assert::same(1.1, $row->decimal2);

$fields = $connection->fetchFields('SELECT 10, 10.5');
Assert::same([10, 10.5], $fields);
});

test('convertDecimal = false', function () {
$connection = connectToDB(['convertDecimal' => false])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/mysql-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::same('1', $row->decimal);
Assert::same('1.10', $row->decimal2);

$fields = $connection->fetchFields('SELECT 10, 10.5');
Assert::same([10, '10.5'], $fields);
});

test('convertDecimal = true', function () {
$connection = connectToDB(['convertDecimal' => true])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/mysql-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::same(1, $row->decimal);
Assert::same(1.1, $row->decimal2);

$fields = $connection->fetchFields('SELECT 10, 10.5');
Assert::same([10, 10.5], $fields);
});
34 changes: 31 additions & 3 deletions tests/Database/connection.options.sqlsrv.phpt
Original file line number Diff line number Diff line change
Expand Up @@ -16,19 +16,47 @@ test('default convertBoolean', function () {
$connection = connectToDB(['convertBoolean' => null])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::equal(true, $row->bit);
Assert::same(true, $row->bit);
});

test('convertBoolean = true', function () {
$connection = connectToDB(['convertBoolean' => true])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::equal(true, $row->bit);
Assert::same(true, $row->bit);
});

test('convertBoolean = false', function () {
$connection = connectToDB(['convertBoolean' => false])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::equal(1, $row->bit);
Assert::same(1, $row->bit);
});


test('default convertDecimal', function () {
$connection = connectToDB(['convertDecimal' => null])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::same(1, $row->decimal);
Assert::same(1, $row->numeric_10_0);
Assert::same(1.1, $row->numeric_10_2);
});

test('convertDecimal = true', function () {
$connection = connectToDB(['convertDecimal' => true])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::same(1, $row->decimal);
Assert::same(1, $row->numeric_10_0);
Assert::same(1.1, $row->numeric_10_2);
});

test('convertDecimal = false', function () {
$connection = connectToDB(['convertDecimal' => false])->getConnection();
Nette\Database\Helpers::loadFromFile($connection, __DIR__ . '/files/sqlsrv-nette_test3.sql');
$row = $connection->fetch('SELECT * FROM types');
Assert::same(1, $row->decimal);
Assert::same(1, $row->numeric_10_0);
Assert::same(1.1, $row->numeric_10_2);
});

0 comments on commit a16b9f5

Please sign in to comment.